2012-02-22 4 views
1

subprocess.communicate()を使用して、子プロセスのstdin/stdoutへの読み書きに問題があります。subprocess.communicate()は処理にゴミを送信しますか?

これは(Cで)子プロセスである

#include <stdio.h> 

int main() 
{ 
    char buf[128]; 
    printf("test\n"); 
    gets(buf); 
    printf("%s", buf); 
    return 0; 
} 

これは、子プログラム

import subprocess 

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

stdin, stderr = proc.communicate() 
print stdin 
proc.communicate(stdin) 
stdin, stderr = proc.communicate() 
print stdin 

print stdin 

が、私はこれが

test 
input was test: 
を印刷するように期待することを呼び出すのpythonでプログラムであり、

しかし、proc.communicate()がgets()のEOFを引き起こし、子アプリケーションが終了するようです。とにかく、EOFを送信せずに子アプリケーションと通信できるのですか?私はアプリケーションにそれを書いてみたいと思います。

+0

私の問題の解決策を見つけることが非常に重要だったので、私は以下の答えを受け入れました。私はまた、入力がバッファされているときに、 'fflush(stdout);'が必要だと付け加えたいと思っていましたが、これは問題を引き起こしていました。 – endeavormac

答えて

1

Popen.communicate()のドキュメントから:

標準入力にデータを送信します。ファイルの終わりに達するまで、stdoutとstderrからデータを読み込みます。プロセスが終了するのを待ちます。

これは、communicate()をサブプロセスに対して1回しか呼び出すことができないことを意味します。

リアルタイム出力の取得は難しい場合がありますが、例では1行だけを読み込もうとしているので難しくありません。以下の作業をする必要があります:あなたのサブプロセスからの出力は、本当にあなたのPythonのプロセスのために標準入力されていないので、私は、あなたのいくつかの変数の名前を変更し

import subprocess 

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

outdata = proc.stdout.readline() 
print outdata 
outdata, errdata = proc.communicate('output was ' + outdata) 
print outdata 

注意を。

+0

+1。また、communications()をまったく使用しないことに決めました。例については、http://stackoverflow.com/questions/9322796/keep-a-subprocess-alive-and-keep-giving-it-commands-python/9327923#9327923を参照してください。 – user9876

関連する問題