繁体   English   中英

为什么不能在python中使用subprocess.PIPE传递参数?

[英]Why cannot pass arguments with subprocess.PIPE in python?

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

但是我所得到的只是''并且我真的不知道该怎么做,我已经读过这篇文章,但是似乎我根本不了解它。。。有人可以向我解释一下如何使用它。之后与其他命令?

提前致谢!!

问题可能出在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

在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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM