ls
,通过Python运行,可能是正确的:我猜测在当前目录中没有名为*CSV*APP*
的文件。可能有一个与该通配符模式匹配的文件。但是ls
不关心通配符。当您在shell上运行命令时,shell会将通配符扩展为它可以看到的当前目录中的匹配文件名,并且这些扩展名称是shell传递给ls
的内容。
要在shell中获得与Python相同的结果(仅用于演示,而不是因为您想要那样做),请使用单引号保护参数免受通配符扩展:
ls -lh '*CVS*APP*'${e}'.zip'
但是如何在Python中获得shell的行为呢?您可以像其他答案建议的那样使用shell=True
,但这是一条很滑的路,因为在动态生成的字符串上调用实际的shell(可能取决于更复杂应用程序中的用户输入)可能会使您容易受到命令注入和其他恶意攻击。
在这里,您只需要shell的一个特定行为,即文件名通配符。而Python恰好能够自己完成这个任务:
import subprocess as sp
from glob import glob
sp.call(['cd', input_dir])
for i, e in enumerate(piv_id_list):
proc_out = sp.Popen(['ls', '-lh', glob('*CSV*APP*{0}.zip'.format(e))])
proc_out_list.append(proc_out)
print(proc_out)
正如JuniorCompressor指出的那样,这仍然会在错误的目录中查找,因为cd
只会影响cd
调用的子进程,因此让我们也修复这个问题:
import subprocess as sp
from glob import glob
os.chdir(input_dir)
for i, e in enumerate(piv_id_list):
proc_out = sp.Popen(['ls', '-lh', glob('*CSV*APP*{0}.zip'.format(e))])
proc_out_list.append(proc_out)
print(proc_out)
你可能可以使用
稍微高级的sp.check_output
代替直接使用
底层的sp.Popen
。
ls
之类的外部依赖,它可以在其他操作系统上运行,而且也并不困难。 - JuniorCompressor