【问题标题】:How to properly pass information between subprocesses using pipes?如何使用管道在子进程之间正确传递信息?
【发布时间】:2019-08-19 08:25:58
【问题描述】:

我试图让一个简单的嵌套管道通过 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 时,它会返回一个整数。

【问题讨论】:

  • 您是否尝试从grep.stdoutdiff.stdout 流中读取以打印其内容?它可能会告诉你更多关于失败的地方。 (看起来wc -l 命令运行正常,但没有收到任何内容,因此为 0。)

标签: python linux subprocess pipe


【解决方案1】:

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

("grep", "'^'")

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

grep "'^'"

所以grep 的参数是一个3 个字符的字符串。如果你不是那个意思,那就干吧

("grep", "^")

很可能你会解决你的问题。

PS:同样,不要期望任何 shell 转义、变量替换等在 subprocess.Popen() 的参数中起作用。这些是外壳功能,外壳会在传递给可执行文件之前对它们进行处理。所以现在你必须自己按摩。

【讨论】:

  • 这很可能会导致它。看起来 wc -l 没有得到任何内容,所以 grep 可能只是没有找到任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2014-03-07
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多