改用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
但即使使用这种技术,也要确保您提供给外部应用程序的输入足够小,以避免在编写时出现阻塞。
如果你的输入也很大,你必须确保你的读写没有阻塞。那么使用线程很可能是一个不错的选择。