我正在尝试做一些非常简单的事情,以便学习如何在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]
但我得到的只是''
而且我真的不知道怎么做,我读过this但似乎我根本没有得到它......可能有人向我解释一下如何在使用其他命令之后使用它?
提前致谢!!
答案 0 :(得分: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
答案 1 :(得分: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)