2013-01-18 24 views
2

如何从Python写入stdout并同时(通过Unix管道)将数据提供给另一个程序?例如,如果您有在Python中按行写入管道的正确方法

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

但是,您希望这样一行一行地执行另一个程序,例如, | wc -l,以便输出myfile中的行。如何做到这一点?谢谢。

+0

你试过了吗?你可能会发现这已经起作用了:)你只需要写入标准输出(在Python中表示为类似文件的对象'sys.stdout'),'print'也可以。 – Thomas

+1

你真的想同时做两个吗?如果是这样,你和'wc'将写入相同的标准输出。那是你要的吗? – abarnert

+0

@abarnert:我希望程序能够基本上写出“wc -l''正在写入的stdin,所以是的,如果我理解了你的问题,我想同时执行这两个操作......这意味着我想写入''wc -l''并实际调用''wc -l'',所以不要像@Thomas建议的那样写stdin。 – user248237dfsf

回答

7

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

如果你想发球就那么其输出都被印刷和被管道输送到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而不是试图手动获取所有烦恼的细节。

+0

我想将''wc''的输出重定向到文件。在这种情况下,我可以在''Popen''中传递''stdout = filehandle''吧? – user248237dfsf

+1

@ user248237:的确如此。如果你想调用'sort',把它管到'grep',然后把它传给'wc',并把它指向一个文件...参见http://docs.python.org/2/library/subprocess.html #替换壳的管道。但是,如果你正在做很多这样的工作,你可能想要考虑一下PyPI的许多更高级别的shell类库,或者只使用bash而不是Python。 – abarnert

+0

是的,当你完成时你应该'wc.wait()'。对于一个快速和肮脏的脚本,你可以退出,但在一个真正的程序中,你总是要“等待”(或“沟通”或其他相同的东西)。 – abarnert

相关问题