如何從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