2011-12-28 19 views
1

subprocess.Popen(POSIXシステム上のPython 2.x)を使用して子プロセスを呼び出しています。私は、Pythonのreadline()ファイルオブジェクト関数を使用して、子プロセスの出力を読み取ることができるようにしたいと考えています。しかし、Popen.stdoutで利用可能なストリームはreadline()メソッドを持っていないようです。 Python readline from pipe on Linuxからのアイデアを使用してsubprocess.Popenによって返されたパイプでreadline()を使用する方法

が、私は次のことを試してみました:

p = subprocess.Popen(
    [sys.executable, "child.py"], 
    stdout=subprocess.PIPE) 
status = os.fdopen(p.stdout.fileno()) 
while True: 
    s = status.readline() 
    if not s: 
     break 
    print s 

しかし、この方法の問題点は両方p.stdoutオブジェクトと単一のファイルディスクリプタをクローズするための新しいstatusオブジェクトの試みということです。結果として、最終的には次のようになります。

以前に作成されたファイルライクなオブジェクトを「ラップする」ファイルオブジェクトを作成する方法はありますか?

+1

'.fileno()'が '.readline()'メソッドを持たない 'p.stdout'をどうやって取得しますか? – jfs

+0

@ J.F.Sebastian:それは良い質問です。私はもう一度試してみました。 'p.stdout.readline()'はうまく動作します。誤って 'p.readline()'を試みた可能性があります。これは恥ずかしいものです。 –

答えて

2

ソリューションは同じパイプを参照する別のファイルディスクリプタを作成するためにos.dup()を使用することです:

status = os.fdopen(os.dup(p.stdout.fileno())) 

この方法で、statusは閉じるために、独自のファイル記述子を持っています。

+1

質問を書くだけで答えが明らかになるのはすばらしいことです。 –

関連する問題