为什么在Python中无法使用subprocess.PIPE传递参数?

0 投票
2 回答
804 浏览
提问于 2025-04-17 14:14

我正在尝试做一些很简单的事情,以便学习如何在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

撰写回答