Используйте communicate()
вместо:
import subprocess
process = subprocess.Popen(['app'], shell=False,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE)
out, err = process.communicate("Some String")
print out
Кроме того, убедитесь, что йо u завершите свой 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;
}
}
Существует предупреждение для этого в документации питона: http://docs.python.org/2/library/subprocess.html#subprocess.Popen.stdin (справа выше)
Он объясняет, что, когда вы пишете на внешнее приложение , данные могут быть помещены в очередь. Кроме того, вывод внешнего приложения также будет помещен в очередь. Связь() будет «очищать» содержимое, которое вы отправляете во внешнее приложение, и ждать, пока ваше приложение не завершится.
Используя 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
Но даже с этой техникой, убедитесь, что вход вы даете внешнему приложение достаточно мал, чтобы избежать блокировок при записи.
Если ваш вход также довольно большой, вам нужно убедиться, что ваши чтения и записи не блокируются. Использование потоков, скорее всего, будет хорошим выбором.
Поскольку скрипт Python ожидает завершения подпроцесса? –
Могу ли я прочитать cout, не дожидаясь завершения процесса? –
Если 'process.stdin' забуферирован, ваши записи могут быть не сразу видны для программы на C++. Аналогично, если 'process.stdout' буферизуется, записи C++ могут быть не сразу видны вашей программе Python. – chepner