如何从Python写入stdout并同时(通过Unix管道)将数据提供给另一个程序?例如,如果您有在Python中按行写入管道的正确方法
# write file line by line
with open("myfile") as f:
for line in f:
print line.strip()
但是,您希望这样一行一行地执行另一个程序,例如, | wc -l
,以便输出myfile
中的行。如何做到这一点?谢谢。
如何从Python写入stdout并同时(通过Unix管道)将数据提供给另一个程序?例如,如果您有在Python中按行写入管道的正确方法
# write file line by line
with open("myfile") as f:
for line in f:
print line.strip()
但是,您希望这样一行一行地执行另一个程序,例如, | wc -l
,以便输出myfile
中的行。如何做到这一点?谢谢。
如果你想管python
到wc
外部,这很容易,而且会只是工作:
如果你想发球就那么其输出都被印刷和被管道输送到wc
,尝试man tee
或,更好的是,你的外壳的内置花式重定向功能。
如果您希望在脚本中运行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
而不是试图手动获取所有烦恼的细节。
我想将''wc''的输出重定向到文件。在这种情况下,我可以在''Popen''中传递''stdout = filehandle''吧? – user248237dfsf
@ user248237:的确如此。如果你想调用'sort',把它管到'grep',然后把它传给'wc',并把它指向一个文件...参见http://docs.python.org/2/library/subprocess.html #替换壳的管道。但是,如果你正在做很多这样的工作,你可能想要考虑一下PyPI的许多更高级别的shell类库,或者只使用bash而不是Python。 – abarnert
是的,当你完成时你应该'wc.wait()'。对于一个快速和肮脏的脚本,你可以退出,但在一个真正的程序中,你总是要“等待”(或“沟通”或其他相同的东西)。 – abarnert
你试过了吗?你可能会发现这已经起作用了:)你只需要写入标准输出(在Python中表示为类似文件的对象'sys.stdout'),'print'也可以。 – Thomas
你真的想同时做两个吗?如果是这样,你和'wc'将写入相同的标准输出。那是你要的吗? – abarnert
@abarnert:我希望程序能够基本上写出“wc -l''正在写入的stdin,所以是的,如果我理解了你的问题,我想同时执行这两个操作......这意味着我想写入''wc -l''并实际调用''wc -l'',所以不要像@Thomas建议的那样写stdin。 – user248237dfsf