communicate()
代わりに使用してください:
import subprocess
process = subprocess.Popen(['app'], shell=False,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE)
out, err = process.communicate("Some String")
print out
また、ある時点で C++ プロセスを終了してください。たとえば、入力ストリームの最後に到達した場合:
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
//...Prep work...
while (cin) { // <-- Will eventually reach the end of the input stream
string input;
cin >> input;
//...Some Work ...
string response = input;
cout << response;
}
}
Python のドキュメントには、これに関する警告があります:
http://docs.python.org/2/library/subprocess.html#subprocess.Popen.stdin (右上)
外部アプリに書き込むと、データがキューに入れられる可能性があることが説明されています。また、外部アプリの出力もキューに入れられる可能性があります。communicate() は、外部アプリに送信しているコンテンツを「フラッシュ」し、アプリが終了するまで待ちます。
を使用communicate()
すると、外部アプリの出力全体がメモリに取得されます。実用的でない場合 (たとえば、大量の出力)、stdin および stdout オブジェクトを使用して書き込みまたは読み取りを行うことができます。「デッドロック」しないように注意する必要があります。
import subprocess
process = subprocess.Popen(['app'], shell=False,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE)
process.stdin.write("Some String")
process.stdin.close() # <-- Makes sure the external app gets an EOF while
# reading its input stream.
for line in process.stdout.readlines():
print line
ただし、この手法を使用しても、書き込み中にブロックされないように、外部アプリに与える入力が十分に小さいことを確認してください。
入力も非常に大きい場合は、読み取りと書き込みがブロックされていないことを確認する必要があります。その場合、スレッドの使用はおそらく良い選択です。