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

4 python unix shell subprocess pipe

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

# write file line by line
with open("myfile") as f:
  for line in f:
    print line.strip()
Run Code Online (Sandbox Code Playgroud)

但是你希望它逐行到另一个程序,例如| wc -l,它输出行myfile.怎么办?谢谢.

aba*_*ert 7

如果你想管道pythonwc外部,这很容易,并且只会工作:

python myscript.py | wc -l
Run Code Online (Sandbox Code Playgroud)

如果你想开球,那么它的输出都会被打印并通过管道传输wc,尝试man tee或者更好的是你的shell的内置花式重定向功能.

如果你想wc -l在脚本中运行,并将输出发送到stdout和它,你也可以这样做.

首先,用于subprocess.Popen开始wc -l:

wc = subprocess.Popen(['wc', '-l'], stdin=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

现在,您可以这样做:

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

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