2013-08-04 45 views
8

我有一個主要的進程,在其中運行一個子進程,其中stdin是我想要管道。我知道我可以使用文件做到這一點:沒有使用文件的子進程管道stdin

import subprocess 
subprocess.call('shell command', stdin=open('somefile','mode')) 

是否有使用自定義的標準輸入管道沒有實際的硬盤驅動器文件中的任何選項?是否有任何選項,例如,使用字符串列表(每個列表元素將是一個換行符)?

我知道python子進程在管道對象上調用.readline()

+1

雖然不一定回答你的問題,這是值得一提的任何POSIX兼容的操作系統支持使用/ dev /標準輸入作爲一個「文件」,這個作品跨越包含使用EOF終止流的shell命令。在OSX,Linux和OpenBSD上使用tcsh和bash驗證了這一點。 – synthesizerpatel

+0

@synthesizerpatel沒有答案,但感謝您的寶貴意見! – ducin

+1

好吧..公平地說,這是**答案。只是不**的答案。 :D – synthesizerpatel

回答

4

首先,使用subprocess.Popen - .call僅僅是它的快捷方式,你會需要訪問Popen實例,以便您可以寫信給管。然後通過subprocess.PIPE標誌作爲stdin kwarg。喜歡的東西:

import subprocess 
proc = subprocess.Popen('shell command', stdin=subprocess.PIPE) 
proc.stdin.write("my data") 

http://docs.python.org/2/library/subprocess.html#subprocess.PIPE

+0

您也可以指定'stdin = 0',同時也通過數值引用stdin文件句柄。 – synthesizerpatel

+0

@synthesizerpatel呃,這是一個微妙的區別,但這是告訴子進程使用* parent *進程的標準輸入 - 不是什麼問,管道中的數據是從字符串列表中產生的(在他的例子中)。除此之外,我不鼓勵在一般情況下傳遞fd-number-句柄(以及'/ dev/stdin'),除非和代理進程中的數據在基準測試中顯示得太慢。原因是共享標準輸入遲早會在錯誤的進程完成讀取操作時引發錯誤,併爲預期的標準輸入處理過程混淆數據流。 – AdamKG

+0

不夠公平,只是覺得使用文件處理的數字值得一提。 – synthesizerpatel