Python的子流程模块从Unix Shell返回不同的结果
问题内容:
我正在尝试使用python获取目录中CSV文件的列表。在UNIX中,这真的很容易:
ls -l *.csv
而且,可以预料的是,我会在目录中找到以.csv结尾的文件的列表。但是,当我尝试使用Subprocess模块进行Python等效时:
>>> import subprocess as sp
>>> sp.Popen(["ls", "-l", "*.csv"], stdout = sp.PIPE)
<subprocess.Popen object at 0xb780e90c>
>>> ls: cannot access *.csv: No such file or directory
有人可以解释发生了什么吗?
编辑 :添加可shell = True
消除错误,但我得到的不是目录中 所有 文件的列表,而只是得到CSV文件的列表。
问题答案:
如果您希望它像在Shell上一样运行,则需要通过shell=True
(您的里程可能会有所不同,具体取决于您的系统和Shell)。在您的情况下,问题是当您这样做时ls -l *.csv
, shell
正在评估*的含义,而不是ls
。(ls
仅格式化您的结果,但是shell做出了繁重的工作来确定要匹配的文件*.csv
)。子进程按字面意义进行ls
处理*.csv
,然后查找具有该特定名称的文件,该文件当然没有任何名称(因为要创建的文件名非常难)。
您真正应该做的是os.listdir
自己使用和过滤名称。