python 中的进程 - 获取非终止进程的标准输出
Process in python - fetch stdout of non-terminating process
假设有一个程序用不同的输入产生不同的输出,如果输入是特定值则终止。比如用C++可以写成:
int main() {
int i;
while(true) {
cin >> i;
if (i) cout << i << endl;
else break;
}
return 0;
}
在这个程序中,如果你输入一个整数,它会把它打印在屏幕上。该程序永远不会终止,直到您键入 0
.
那我如何用Python立即获取stdin对应的stdout呢?也就是说,如果我在标准输入中输入“1”,我会期望在进程尚未终止时立即从标准输出中获取“1”。
结论:有两种实现方式。
使用subprocess.Popen
,将子进程的stdout或stdin当作一个文件写入stdin(需要'\n'
),从stdout读取readline
使用库预期。
使用subprocess.Popen()
:
>>> import subprocess
>>> p = subprocess.Popen(['/your/cpp/program'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> p.stdin.write('1\n')
>>> p.stdout.readline()
'1\n'
>>> p.stdin.write('10\n')
>>> p.stdout.readline()
'10\n'
>>> p.stdin.write('0\n')
>>> p.stdout.readline()
''
>>> p.wait()
0
假设有一个程序用不同的输入产生不同的输出,如果输入是特定值则终止。比如用C++可以写成:
int main() {
int i;
while(true) {
cin >> i;
if (i) cout << i << endl;
else break;
}
return 0;
}
在这个程序中,如果你输入一个整数,它会把它打印在屏幕上。该程序永远不会终止,直到您键入 0
.
那我如何用Python立即获取stdin对应的stdout呢?也就是说,如果我在标准输入中输入“1”,我会期望在进程尚未终止时立即从标准输出中获取“1”。
结论:有两种实现方式。
使用
subprocess.Popen
,将子进程的stdout或stdin当作一个文件写入stdin(需要'\n'
),从stdout读取readline
使用库预期。
使用subprocess.Popen()
:
>>> import subprocess
>>> p = subprocess.Popen(['/your/cpp/program'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> p.stdin.write('1\n')
>>> p.stdout.readline()
'1\n'
>>> p.stdin.write('10\n')
>>> p.stdout.readline()
'10\n'
>>> p.stdin.write('0\n')
>>> p.stdout.readline()
''
>>> p.wait()
0