Re: [问题] subprocess问题

楼主: lionel20002 (遥かなソラ)   2016-06-24 15:34:44
又搞了一个上午 好像找到问题在哪了
主要问题是python端不能读到空的buffer,
一读到空的buffer python就会一直等C的输入 然后就等到死
换句话说 python需要知道现在buffer里面有多少东西是我要读出来的
直接call read()读整份文件 没有指定要读几个char或是读几行的话
就会把目前的东西都读出来以后一直等C再input
所以这时候用工作管理员把C干掉python就可以解除等待继续运作 就可以看到资料print出来
整理一下 这个程式主要有两个问题
1. C端没有fflush,printf完buffer住没有写出去,python读不到东西就一直等
2. python端没有指定要读多少资料,于是把目前资料读出以后开始等C输入
两个问题都解决资料就能正常收送了
※ 引述《lionel20002 (遥かなソラ)》之铭言:
: 手边有一个python的GUI,另外开了一个C的subprocess
: 目前signal从python丢到C或是C丢到python都正常收到
: 但是资料的收送有些问题
: Python Code:
: 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 code:
: 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),python端就可以收到C print出来的"Caught signal XXX"
: 但是因为stdout close了 再传资料就会显示PIPE坏掉无法传
: 没有fclose(stdout)会当在python的outstr = fpi_c.stdout.read()
: 感觉好像是python一直在等C执行结束才会收值 但是C只会一直等signal不会自己结束
: 所以就卡死?
: 或者是subprocess.PIPE的管理根本就不对?
: 昨天一整天都在找资料跟尝试 还是无法搞定
: 怎样才能让资料正常收送 恳请高手帮忙m(_ _)m

Links booklink

Contact Us: admin [ a t ] ucptt.com