2013-04-09 78 views
0

传达我有这样的代码用Python子进程

p.stdin.write('alloc ' + str(size) + '\n' + chr(0x1a)) 
p.stdin.flush() 
stdout = p.stdout.readline() 

的问题是,剧本一直挂在的ReadLine()

如果我更换

p.stdin.flush() 

p.stdin.close() 

它的工作原理,但不允许我继续与进程沟通

我应该怎么做才能将数据发送到标准输入并从标准输出读取回复,并且仍然能够在脚本中重复该操作?

+0

子进程可能使用缓冲输出,除非您告诉我们它是什么,否则我们不能说是否有办法使其无缓冲。 – msw 2013-04-09 15:24:18

+0

Python 2或Python 3? – cdarke 2013-04-09 15:26:40

+0

这是一个简单的c程序,用 fgets(line,MAX_LINE_LENGTH,stdin)读取; – mOnAr 2013-04-09 15:26:43

回答

0

并且子过程使用fprintf(stdout,“%d \ n”,my_alloc(data))写入;

就像你在父进程做了,你就必须在fflush(stdout)fprintf()的孩子,因为stdio库将缓冲输出(通常要等到有等待写BUFSIZ字节)。

您可能会看到,当您从shell运行孩子时,它看起来像是在每个换行符上输出输出。这是因为stdio库在连接到终端时会设置行缓冲。它连接到管道时不这样做。有关详细信息,请参阅isatty(3)setbuf(3)

你在Python方面做得很对,现在你必须在管道的C端做同样的事情。 Python readline被阻塞,因为孩子尚未向管道发送任何东西。