相关疑难解决方法(0)

Python C程序子进程挂起"for line in iter"

好的,我试图从python脚本运行一个C程序.目前我正在使用测试C程序:

#include <stdio.h>

int main() {
while (1) {
    printf("2000\n");
    sleep(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

模拟我将要使用的程序,它不断地从传感器获取读数.然后我试图"2000"从C程序读取输出(在这种情况下)与python中的子进程:

#!usr/bin/python
import subprocess

process = subprocess.Popen("./main", stdout=subprocess.PIPE)
while True:
    for line in iter(process.stdout.readline, ''):
            print line,
Run Code Online (Sandbox Code Playgroud)

但这不起作用.从使用print语句开始运行该.Popen行然后等待for line in iter(process.stdout.readline, ''):,直到我按下Ctrl-C.

为什么是这样?这正是我见过的大多数示例都是他们的代码,但它没有读取文件.

编辑:

有没有办法让它只在有东西被阅读时才能运行?

c python subprocess hang

17
推荐指数
2
解决办法
5446
查看次数

在重定向的stdout管道上禁用缓冲(Win32 API,C++)

我正在使用Win32生成一个进程CreateProcess,设置hStdOutput和创建的管道句柄的hStdError属性.我有两个线程读取管道,等待数据可用(或完成的过程,此时它检查在终止线程之前没有剩余数据). 随着数据变得可用,我将输出写入有效的大文本框.STARTUPINFOCreatePipe

正在发生的事情是输出被缓冲,因此缓慢运行的进程只会在文本框中抛出大量数据,但不会"发生".

我不确定它是否正在进行缓冲管道,或者与重定向有关.

有没有办法将管道设置为无缓冲,或者以尽快发送stdout的方式启动进程?

我正在使用一个测试应用程序进行测试

Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
Run Code Online (Sandbox Code Playgroud)

windows winapi redirect stdout

14
推荐指数
1
解决办法
8042
查看次数

使用管道重定向时,Windows控制台程序stdout被缓冲

我有一个用QT/c ++编写的长期服务器程序(比如程序A).程序不是那么稳定所以我决定写一个python脚本,如果它崩溃重启它.问题是程序可能启动失败(如果我给它一个使用中的端口),打印错误,然后只是挂起而不退出,所以我必须监视程序的stdout并在失败的启动时杀死它.

这是我的最终代码(好吧,实际上这没关系,你可以忽略它):

self.subp = subprocess.Popen(
    r'.\A.exe -server %d' % portnum,
    stdout=subprocess.PIPE, bufsize=1)
for line in iter(self.subp.stdout.readline, ''):
    print(line, end='')
Run Code Online (Sandbox Code Playgroud)

但我发现我无法读取子进程的stdout中的任何内容,readline方法只是阻塞那里,如果我杀死A进程,python脚本只是退出而没有任何输出.在开始时,我认为这是一个子进程模块的问题,但经过一些测试,我发现它不是.如果我用其他一些Windows控制台程序替换A.exe命令行,例如ping -t,一切正常.所以我认为这可能是A程序的问题.

幸运的是,我有一个A的源代码,这里是一个处理输出的部分:

printf("Server is starting on port %u\n", Config.ServerPort);

if(server->listen())
    printf("Starting successfully\n");
else
    printf("Starting failed!\n");
Run Code Online (Sandbox Code Playgroud)

经过一些搜索,我添加fflush(stdout);到这段代码的末尾,重建程序,现在它的工作原理

所以我的问题是我仍然无法理解,原来的A程序代码有什么问题?没有强制刷新,它可以在程序启动后立即在Windows控制台中正确打印这些字符串.为什么在输出管道上使用管道时缓冲输出?我在标准c工具中看到,输出将在换行时自动刷新,但为什么不在我的情况下呢?这是一个Windows问题,还是编译问题?

A程序用QT/C++编译,QT版本是4.7.4(x32),C++编译器是ming32 g ++自带QT(GCC 4.4.0),所有测试都在win7x64平台上进行,我的python版本是2.7.2

windows buffer stdout pipe fflush

6
推荐指数
0
解决办法
3980
查看次数

标签 统计

stdout ×2

windows ×2

buffer ×1

c ×1

fflush ×1

hang ×1

pipe ×1

python ×1

redirect ×1

subprocess ×1

winapi ×1