在Python中逐行写入管道的正确方法

时间:2013-01-18 23:47:20

标签: python shell unix subprocess pipe

如何从Python写入stdout并同时(通过Unix管道)将其提供给另一个程序?例如,如果你有

# write file line by line
with open("myfile") as f:
  for line in f:
    print line.strip()

但是你想要逐行到另一个程序,例如| wc -l以便输出myfile中的行。怎么办?感谢。

1 个答案:

答案 0 :(得分:7)

如果您想在外部将python传递给wc,那很容易,而且会起作用:

python myscript.py | wc -l

如果你想开球,那么它的输出都会被打印并被传送到wc,请尝试man tee,或者更好的是,你的shell内置花哨的重定向功能。

如果您希望从脚本中运行wc -l,并将输出发送到stdout和它,那么您也可以这样做。

首先,使用subprocess.Popen启动wc -l

wc = subprocess.Popen(['wc', '-l'], stdin=subprocess.PIPE)

现在,您可以这样做:

# write file line by line
with open("myfile") as f:
  for line in f:
    stripped = line.strip()
    wc.stdin.write(stripped + '\n')

这将使wc的输出与脚本的输出位置相同。如果那不是您想要的,您也可以将其stdout作为PIPE。在这种情况下,您希望使用communicate而不是尝试手动获取所有繁琐的详细信息。