2017-04-03 83 views
0

此問題與python subprocess.Popen - write to stderr相同。但是沒有正確的答案。如何寫入Python子進程的stderr?

我知道這是正確的。

import sys 
sys.stderr.write('abcd') 

這裏是子過程(命名爲輸入)的代碼。我想讓子進程(輸入)打印由父進程寫入的字符串。

int main(int argc, char* argv[], char* envp[]){ 
    char buf[5]; 
    read(2, buf, 4); 
    buf[4]=0; 
    printf("%s\n", buf); 
} 

我想寫入一個Python子進程stderr。但是,這是不正確的。 (也許你可以糾正這種或只是把我介紹另一 方式。)

from subprocess import * 
p = Popen(['./input'],stderr=PIPE) 
p.stderr.write('abcd') 

我有錯誤是這樣的。

IOError: File not open for writing 

感謝您的幫助。

+1

如果您成功做到這一點,您希望在哪裏出現「abcd」?它不會出現在終端上,因爲管道的一端連接到子流程,另一端連接到父進程。理論上它可以出現在子過程中,但它只會*寫入* stderr,而不是*讀取*。你想要發生什麼? –

+1

子進程寫入其stderr。通過將其設置爲管道,您可以設置父級以從中讀取。如果你想讓子進程寫入它的stderr,它所執行的進程必須這樣做。如果你想讓這個錯誤消息進入父進程的stderr,那麼你應該什麼都不做,並且這個孩子會繼承父進程的stderr。 –

+0

當你打開一個像這樣的子進程時,stderr通常作爲只讀流打開。當然,你正在得到那個錯誤。你究竟在做什麼以及爲什麼。在這種情況下,一些更詳細和具體的背景可能確實有幫助。 –

回答

2

os.pipe()

打開一個管道或從命令。返回值是連接到管道的打開文件對象,根據模式是'r'(默認)還是'w'可以讀取或寫入。 bufsize參數與內建的open()函數的相應參數具有相同的含義。該命令的退出狀態(以wait()指定的格式編碼)可用作文件對象的close()方法的返回值,但退出狀態爲零(無錯終止)時,None回。

更改您的Python代碼這一點:

from subprocess import * 
import os 

r, w = os.pipe() 
p = Popen(['./input'],stderr=r, stdout=PIPE) 
os.close(r) 
os.write(w, b'abcd') 
os.close(w) 
print(repr(p.communicate()[0])) 

您可以閱讀Python os.pipe Examples

+1

你說得對。非常感謝。我需要了解更多關於管道的知識。 :P – pinohans