Pythonsubprocess通配符的用法

import os import subprocess proc = subprocess.Popen(['ls','*.bc'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out,err = proc.communicate() print out 

这个脚本应该打印所有带有.bc后缀的文件,但是它会返回一个空的列表。 如果我在命令行中手动执行ls * .bc,它将起作用。 在脚本里面做['ls','test.bc']也可以,但是由于某些原因,星号不起作用。任何想法?

您需要提供shell=True才能通过shell解释器执行命令。 如果你这样做,你不能再提供一个列表作为第一个参数,因为参数将被引用。 相反,请指定原始命令行,并将其传递给shell:

  proc = subprocess.Popen('ls *.bc', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

扩展* glob是shell的一部分,但默认情况下, subprocess不会通过shell发送命令,因此执行命令(第一个参数, ls ),然后将文字*用作参数。

这是一件好事,请参阅子stream程文档的“常用参数”部分中的警告块 。 它主要讨论安全含义,但也可以帮助避免愚蠢的编程错误(因为没有魔术shell字符担心)

我对shell=True主要抱怨是它通常意味着有一个更好的方法去解决这个问题 – 用你的例子,你应该使用glob模块 :

 import glob files = glob.glob("*.bc") print files # ['file1.bc', 'file2.bc'] 

这会更快(没有启动开销),更可靠和跨平台(不依赖于有ls命令的平台)