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 *.csvshell
正在评估*的含义,而不是ls。(ls仅格式化您的结果,但是shell做出了繁重的工作来确定要匹配的文件*.csv)。子进程按字面意义进行ls处理*.csv,然后查找具有该特定名称的文件,该文件当然没有任何名称(因为要创建的文件名非常难)。

您真正应该做的是os.listdir自己使用和过滤名称。