2017-04-03 3 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」はどこに表示されますか?パイプの一端はサブプロセスに接続され、もう一方は親プロセスに接続されているため、端末には表示されません。理論的には、それはサブプロセスに出現する可能性がありますが、読み込み*ではなく、標準エラー出力にのみ書き込まれます。あなたは何をしたいですか? –

+1

サブプロセスはstderrに書き込みます。それをパイプにすることによって、親からそれを読み取るように設定します。サブプロセスがstderrに書き込むようにするには、そのexecプロセスが実行する必要があります。そのエラーメッセージを親プロセスのstderrに送る場合は、何もしないでください。子プロセスは親プロセスのstderrを自身のプロセスとして継承します。 –

+0

stderrは、通常、そのようなサブプロセスを開くと読み取り専用ストリームとして開きます。もちろん、そのエラーが発生しています。あなたは実際何をやろうとしているのですか?この場合、より詳細で具体的な背景が実際に役立つかもしれません。 –

答えて

2

os.pipe()またはコマンドから

オープンパイプ。戻り値は、パイプに接続された開いているファイルオブジェクトで、モードが 'r'(デフォルト)か 'w'かによって読み書きできます。 bufsize引数は、組み込みのopen()関数の対応する引数と同じ意味を持ちます。コマンドの終了状態(wait()に指定された形式でエンコードされた形式)は、ファイルオブジェクトのclose()メソッドの戻り値として使用できます。ただし、終了ステータスが0(エラーなし終了)戻ってきた。

これにあなたの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

関連する問題