我知道如何使用 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 许可协议
我认为您想在这里实例化两个单独的 Popen 对象,一个用于“ls”,另一个用于“sed”。您需要将第一个 Popen 对象的
stdout
属性作为stdin
参数传递给第二个 Popen 对象。例子:
如果您有更多命令,您可以继续以这种方式链接:
有关如何使用子流程的更多信息,请参阅 子流程文档。