为什么在Python中无法使用subprocess.PIPE传递参数?
我正在尝试做一些很简单的事情,以便学习如何在Python中使用subprocess
模块。
我想做的是这个:
ll | egrep "*gz"
所以在看了Python的手册后(我其实没太看懂),我尝试了这个:
lista = subprocess.Popen(['ls', '-alF'], stdout=subprocess.PIPE)
filtro = subprocess.Popen(['egrep', '"*gz"'], stdin=lista.stdout, stdout=subprocess.PIPE)
filtro.communicate()[0]
但是我得到的结果只是''
,我真的不知道该怎么做。我看过这个链接,但我似乎完全没搞懂……有没有人能给我解释一下这个是怎么回事,以便我以后能用在其他命令上呢?
提前谢谢大家!!
2 个回答
0
在Unix系统中,可以利用shell
的参数功能:
lista = subprocess.Popen('ls -alF', stdout=subprocess.PIPE, shell=True)
filtro = subprocess.Popen('egrep "*gz"', stdin=lista.stdout, stdout=subprocess.PIPE, shell=True)
filtro.communicate()[0]
你可以直接复制命令,而不用担心把它们拆分成参数列表。
另外,你也可以明确指定使用哪个shell:
subprocess.Popen('bash -c "ls -l"', stdout=subprocess.PIPE, shell=True)
1
问题可能出在你给 egrep 的参数上,双引号用得不对。试试这样:
import subprocess
ls = subprocess.Popen(['ls', '-alF'], stdout=subprocess.PIPE)
egrep = subprocess.Popen(['egrep', '\.gz$'], stdin=ls.stdout, stdout=subprocess.PIPE)
print egrep.communicate()[0]
我猜你是想找以 ".gz" 结尾的文件,因为你最开始的正则表达式不太合理。如果你只是想找以 "gz" 结尾的文件,可以用 'gz$'。如果你不在乎 "gz" 出现在行的哪个位置,那就直接用 'gz'。
补充说明:这里有个完整的例子。在一个包含三个文件 "pipe.py"、"test1.py.gz" 和 "test2.py.gz" 的文件夹里,"pipe.py" 是上面的脚本,我执行:
$ python pipe.py
得到的结果是
-rw-r--r-- 1 amaurea amaurea 146 Jan 30 20:54 test1.py.gz
-rw-r--r-- 1 amaurea amaurea 150 Jan 30 20:54 test2.py.gz