2013-01-18 56 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

相關問題