【问题标题】:Why cannot pass arguments with subprocess.PIPE in python?为什么不能在 python 中使用 subprocess.PIPE 传递参数?
【发布时间】:2013-01-14 18:57:36
【问题描述】:

我正在尝试做一些非常简单的事情来学习如何在 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,但似乎我根本不明白......有人可以向我解释一下如何这可以在与其他命令一起使用之后使用它吗??

提前致谢!!

【问题讨论】:

  • 这里的星号是否应该被扩展以匹配 glob 表达式?
  • 您输入了lista 而不是list。使用列表作为名称也不是一个好主意。
  • @fp 哦,对不起,但这不是错误,我只是试着把它写成英文!!
  • print filter.communicate()看看执行的时候有没有报错。 list是python中使用的名称,所以如果将其用作变量名会很混乱。
  • 您能否准确发布您得到错误结果的代码,而不是翻译版本? IE。作为一个独立的脚本我们可以测试吗?您似乎已经了解 subprocess 的工作原理,因此错误可能只是某处的一个小错误。

标签: python subprocess


【解决方案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

【讨论】:

  • @user1924264 运行它的目录中有哪些文件?那里有 .gz 文件吗?
  • @user1924264 我的测试(对我有用)是在交互式 ipython shell 中进行的。如果您将它作为普通的 python 脚本运行,则需要打印才能实际查看通信的输出。我现在已将其添加到上面的代码中。
  • @user1924264 上面的例子适合我。我将用一个完整的例子更新答案,我如何运行它,以及我得到什么作为输出。
  • 嗯...这很奇怪,我不得不去,现在当我回来时,我又做了一次,它奏效了...这到底是怎么回事??
【解决方案2】:

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

【讨论】:

  • 是的,我这样做了,它奏效了,但它也表示它非常不安全,如果某些东西有特殊字符,@$$ 很难逃脱它们,所以我尝试了更安全的方式,如果您阅读我在所选答案中所做的最后一条评论,您会看到我已经这样做了,无论如何谢谢!
  • 对不起,没有阅读整个主题。我发现 shell 参数在我的项目中非常方便,所以我决定分享它
  • 是的,谢谢你,如果我能给你一个建议,你应该尝试按照我的方式去做,因为更安全,谢谢分享!!
猜你喜欢
  • 2011-10-27
  • 2021-07-18
  • 2022-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多