0

我正在尝试做一些非常简单的事情来学习如何subprocess在 python中使用

我正在尝试的是:

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]

但我得到的只是'',我真的不知道该怎么做,我读过这个,但似乎我根本没有明白......有人可以向我解释一下这是如何工作的,以便之后使用它与其他命令?

提前致谢!!

4

2 回答 2

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
于 2013-01-30T20:28:24.163 回答
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]

您可以简单地复制命令,不必担心将它们分解为参数列表。

您也可以明确指定外壳:

subprocess.Popen('bash -c "ls -l"', stdout=subprocess.PIPE, shell=True)
于 2013-01-31T03:10:08.697 回答