好的,我试着从一个python脚本运行一个C程序。目前我正在使用一个测试C程序:
#include <stdio.h>
int main() {
while (1) {
printf("2000\n");
sleep(1);
}
return 0;
}
为了模拟我将要使用的程序,它不断地从传感器获取读数。
然后,我试图从C程序中读取输出(在本例中为"2000"
),其中包含python中的子进程:
#!usr/bin/python
import subprocess
process = subprocess.Popen("./main", stdout=subprocess.PIPE)
while True:
for line in iter(process.stdout.readline, ''):
print line,
但这不管用。从使用print语句开始,它运行.Popen
行,然后在for line in iter(process.stdout.readline, ''):
处等待,直到我按下Ctrl-C
这是为什么?这正是我看到的大多数示例的代码,但它并没有读取文件。
编辑:
有没有办法让它只在有东西要读的时候运行?
这是一个块缓冲问题。
下面是我对Python: read streaming input from subprocess.communicate()问题的回答的案例版本的扩展。
直接修复C程序中的stdout缓冲区
基于
stdio
的程序通常是行缓冲的,如果它们在终端中以交互方式运行,并且当它们的stdout重定向到管道时,块缓冲。在后一种情况下,在缓冲区溢出或刷新之前,不会看到新行。为了避免在每次调用后调用
fflush()
,可以通过在一开始调用C程序来强制行缓冲输出:在这种情况下,只要打印换行符,就会刷新缓冲区。
或者在不修改C程序源的情况下修复它
有一个
stdbuf
实用程序允许您在不修改源代码的情况下更改缓冲类型,例如:还有其他可用的实用程序,请参见Turn off buffering in pipe。
或使用伪TTY
要诱使子进程认为它是交互运行的,可以使用^{} module 或其类似代码,对于使用
pexpect
和pty
模块的代码示例,请参见Python subprocess readlines() hangs。这里是这里提供的pty
示例的变体(它应该在Linux上工作):或者通过
使用pexpect
pty
pexpect
将pty
处理包装到higher level interface:Q: Why not just use a pipe (popen())?解释了伪TTY为什么有用。
见readline docs。
您的代码:
正在等待EOF或换行。
我不知道你最终想要做什么,但是在printf中添加一个新行,例如
printf("2000\n");
,至少可以让你开始。你的程序没有挂起,只是运行得很慢。您的程序正在使用缓冲输出;
"2000\n"
数据不会立即写入stdout,但最终会成功。在您的情况下,可能需要BUFSIZ/strlen("2000\n")
秒(可能是1638秒)才能完成。在这行之后:
添加
相关问题 更多 >
编程相关推荐