我有这个C程序:
#include <stdio.h>
#include <Windows.h>
int main() {
for (int i=0;; i++) {
printf("%i\n",i);
Sleep(100);
}
return 0;
}
我有一个Python脚本试图捕获它的输出并用它做一些事情:
from subprocess import Popen, PIPE
p = Popen("a.exe", stdout=PIPE, shell=True)
print p.stdout.readline()
...它挂在最后一行而不在屏幕上打印任何内容。
我尝试使用Python shell解决了这个问题并找到了:
>>> from test import *
>>> p.stdout.flush()
>>> p.stdout.readline()
'0\r\n'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
^CKeyboardInterrupt
它实际上可以读取输出但仅在我发送KeyboardInterrupt时。 p.stdout.read(1)
的行为方式相同。
那么,什么是一种正常的,正确的方式来做我想做的事情?
编辑:
好的,看起来在Windows上是不可能的,请看第一回答的评论。
答案 0 :(得分:0)
输出正在缓冲,因此您需要使用iter(p.stdout.readline,"")
p = Popen("a.exe", stdout=PIPE)
for line in iter(p.stdout.readline,""):
print line
如果sys.stdout.flush()
如果不起作用,请尝试从c刷新stdout,据我所知,在写入管道时,行是块缓冲的:
int main() {
for (int i=0;; i++) {
printf("%i\n",i);
Sleep(100);
fflush(stdout);
}
return 0;
}
答案 1 :(得分:0)
我很久以前做过的事情的粗略例子。
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while process.poll() is None:
txt = process.stdout.read().decode("utf-8")
result += txt
您可以创建自己的StringIO来处理文件io操作,如读取和写入。
https://docs.python.org/3/library/io.html
我没有测试下面的代码!
import io
buffer = io.StringIO()
p = Popen(["a.exe"], stdout=buffer)
答案 2 :(得分:0)
在unbuffered mode中运行python:
python -u myprogram.py