使用Python从正在运行的C程序中捕获stdout

时间:2015-03-18 20:40:35

标签: python windows python-2.7 pipe stdout

我有这个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上是不可能的,请看第一回答的评论。

3 个答案:

答案 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