将多个 Popen 命令与管道链接起来

新手上路,请多包涵

我知道如何使用 cmd = subprocess.Popen 运行命令,然后使用 subprocess.communicate。大多数时候,我使用 shlex.split 标记化的字符串作为 Popen 的“argv”参数。使用“ls -l”的示例:

 import subprocess
import shlex
print subprocess.Popen(shlex.split(r'ls -l'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]

但是,管道似乎不起作用……例如,以下示例返回注释:

 import subprocess
import shlex
print subprocess.Popen(shlex.split(r'ls -l | sed "s/a/b/g"'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]

你能告诉我我做错了什么吗?

谢谢

原文由 user940797 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 591
1 个回答

我认为您想在这里实例化两个单独的 Popen 对象,一个用于“ls”,另一个用于“sed”。您需要将第一个 Popen 对象的 stdout 属性作为 stdin 参数传递给第二个 Popen 对象。

例子:

 p1 = subprocess.Popen('ls ...', stdout=subprocess.PIPE)
p2 = subprocess.Popen('sed ...', stdin=p1.stdout, stdout=subprocess.PIPE)
print p2.communicate()

如果您有更多命令,您可以继续以这种方式链接:

 p3 = subprocess.Popen('prog', stdin=p2.stdout, ...)

有关如何使用子流程的更多信息,请参阅 子流程文档

原文由 Alex Smith 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题