我有两个程序。第一个 ( subprocess.cpp
) 用 C++ 编写:
#include <stdio.h>
int main() {
char * line = new char[1000];
// first scan
scanf("%s\n", line);
printf("%s\n", line);
fflush(stdout);
// second scan
scanf("%s\n", line);
printf("%s\n", line);
fflush(stdout);
return 0;
}
该程序只是从标准输入中获取两个字符串并在标准输出上打印,毕竟是冲洗。test.py
这是用 Python 2.7 编写的第二个程序 ( ):
from subprocess import Popen
from subprocess import PIPE
from subprocess import Popen
# create process
my_process = Popen("./subprocess", stdin = PIPE, stdout = PIPE)
# send initial data
my_process.stdin.write('abc\n')
my_process.stdin.flush()
my_process.stdin.write('xyz\n')
my_process.stdin.flush()
# read data from subprocess
print "Subprocess line 1 :: " + str(my_process.stdout.readline())
print "Subprocess line 2 :: " + str(my_process.stdout.readline())
这个脚本应该启动子进程,发送和检索两个字符串。看看发生了什么:
marcin@marcin-Aspire-7540 ~/Desktop/inzynierka $ g++ subprocess.cpp -o subprocess
marcin@marcin-Aspire-7540 ~/Desktop/inzynierka $ python test.py
Subprocess line 1 :: abc
test.py
正在等待程序的第二行subprocess
。程序subprocess
无法发送第二个字符串,因为它正在等待 '\n' 字符。
如果我将第二个更改scanf
为subprocess.cpp
( scanf("%s\n", line);
no \n
) 一切正常。当我发送另外一行时也会发生同样的情况test.py
:
# send initial data
my_process.stdin.write('abc\n')
my_process.stdin.flush()
my_process.stdin.write('xyz\n')
my_process.stdin.flush()
my_process.stdin.write('ADDITIONAL\n')
my_process.stdin.flush()
似乎 Python 在刷新后没有发送最后一个 \n 字符(请参见更改 scanf 的示例)。添加一个额外的写入和刷新test.py
证明,在刷新后丢失的 \n 字符仍在缓冲区中。
那该怎么办?如何使 Python 的刷新刷新所有字符?