如何使用管道在子流程之间正确传递信息?

时间:2019-03-28 14:13:29

标签: python linux subprocess pipe

我试图通过使用子进程的Python脚本来获得一个简单的嵌套管道,但是我得到的输出没有意义。

我尝试将diff的输出重定向到grep,并从grep重定向到wc,然后检查输出,但是没有运气。

import subprocess

diff = subprocess.Popen(("diff", "-y", "--suppress-common-lines", "file1.py", "file2.py"), stdout=subprocess.PIPE)
diff.wait()
grep = subprocess.Popen(("grep", "'^'"), stdin=diff.stdout, stdout=subprocess.PIPE)
grep.wait()
output = subprocess.check_output(('wc', '-l'), stdin=grep.stdout)
print(output)

我希望这导致file1.pyfile2.py之间的行数有所不同,但是我得到了

b'       0\n'

在命令行中,当我运行diff -y --suppress-common-lines file1.py file2.py | grep '^' | wc -l时,它将返回一个整数。

1 个答案:

答案 0 :(得分:1)

如果您在python子进程调用中这样做

("grep", "'^'")

在命令行中,您的意思是:

grep "'^'"

因此grep的参数是一个3个字符的字符串。如果您不是那个意思,只需做

("grep", "^")

很可能会解决您的问题。

PS:类似地,在subprocess.Popen()的参数中,不要期望任何shell换码,变量替换等工作。这些是外壳程序功能,外壳程序将在传递给可执行文件之前对其进行按摩。因此,现在您必须自己按摩。