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
命令的平台)