[英]Python hang when reading data from C subprocess
我有一个Python GUI,它将在启动时打开C子进程,并在关闭时杀死C子进程。
正确捕获了从python发送到C以及从C到python发送的信号。 但是,在python端接收数据时存在一些问题。
这是我的程序:
Python代码:
fpi_c = subprocess.Popen(["./FPI_sig"],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
def handle_inform_from_c(signum, frame):
print("receved:", signum)
outstr = fpi_c.stdout.read()
print outstr
signal.signal(signal.SIGUSR1, handle_inform_from_c)
def gui_sense_and_save_fpi_2():
fpi_c.stdin.write(str(123)+"\n")
os.kill(fpi_c.pid,signal.SIGUSR1)
,其中gui_sense_and_save_fpi_2
用一个按钮连接。 按下按钮后,数据和信号SIGUSR1将被发送到C子进程。
C代码:
void signal_callback_handler2(int signum)
{
int gpid;
scanf("%d",&gpid);
printf("Caught signal %d\n",signum);
//fclose(stdout);
signal(SIGUSR1, signal_callback_handler2);
kill(getppid(),SIGUSR1);
}
int main()
{
signal(SIGUSR1, signal_callback_handler2);
while(1)
{
sleep(0.5);
}
return EXIT_SUCCESS;
}
如果我添加fclose(stdout)
,我可以捕获由C在python结尾打印的消息"Caught signal XXX"
。
但是,关闭stdout
会使PIPE损坏,我无法再发送数据。
如果没有fclose(stdout)
,程序将挂在outstr = fpi_c.stdout.read()
。
我已经在C中的printf
和python中的fpi_c.stdin.flush()
fflush(stdout)
之后尝试了fflush(stdout)
,但是它仍然挂起。
挂起时,如果我强制任务管理器关闭C进程,则可能会在python端捕获消息。
似乎python正在等待C的终止。
但是,除非Python GUI关闭,否则我不希望关闭C进程。
如何正确发送和接收数据?
谢谢。
可以使用fflush
刷新输出流,而不是fclose
输出流,以便将缓冲区中的内容写出,并且父进程可以读取它:
printf("Caught signal %d\n", signum);
fflush(stdout);
终于找到解决办法了……
如果Python尝试从空缓冲区读取数据,在这种情况下,它将等待C的输入并挂起。
原始代码中应解决两个问题:
在printf
之后添加fflush(stdout)
。
否则,除非调用fflush(stdout)
,否则输出将被缓冲并且不会实际写入。
Python需要知道应该读取多少个字符或多少行。
不要使用fpi_c.stdout.read()
。 这将等待C输入并挂起。 而是使用fpi_c.stdout.read(1)
读取1个字符,或使用fpi_c.stdout.readline()
读取1行。
这样的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.