从shell命令输出读取python

从shell命令输出读取python,python,shell,subprocess,Python,Shell,Subprocess,我知道你可能会认为这是一个重复的问题,但到目前为止,我没有找到解决我自己问题的方法 目前,我有一个连续产生数据流的C程序。我希望有一种方法可以让我的python程序读取这些数据,这样我就不必用C语言完成所有工作 C程序主要感觉如下: int i = 0; while(1){ printf("%d %d\n", i, i+1); i++; } 我阅读并尝试了Python中的子流程,似乎它们都需要等待命令完成。(例如:)我希望有一些缓冲机制,这样我就可以记录这个位流并逐行处理它。谢

我知道你可能会认为这是一个重复的问题,但到目前为止,我没有找到解决我自己问题的方法

目前,我有一个连续产生数据流的C程序。我希望有一种方法可以让我的python程序读取这些数据,这样我就不必用C语言完成所有工作

C程序主要感觉如下:

int i = 0;
while(1){
    printf("%d %d\n", i, i+1);
    i++;
}
我阅读并尝试了Python中的子流程,似乎它们都需要等待命令完成。(例如:)我希望有一些缓冲机制,这样我就可以记录这个位流并逐行处理它。谢谢

若干假设:

1) 可以丢弃已处理的行

2) 缓冲区/队列大小不会有问题,因为我可以从源代码控制速率,以匹配python程序的处理速度

还有一点背景: C程序基本上驱动一个摄像头提要(这就是为什么它是用C编写的),执行一些OpenCV操作并输出一个对象位置(x,y)int值。 python程序需要进行进一步处理


谢谢。

下面是一种使用子流程模块逐行处理c(或shell)程序输出的方法:

from subprocess import Popen, PIPE
# Set up the process
p = Popen("yourprogram", stdout=PIPE, close_fds=True)
count = 0
while True:
    count += 1
    print '%s: %s' % (count, p.stdout.readline().strip())
出于演示目的,
yourprogram
可以是一个简单的shell脚本(设置了可执行位):

运行python程序会产生:

$ python test.py
1: Thu Dec  5 23:31:45 PST 2013
2: Thu Dec  5 23:31:46 PST 2013
3: Thu Dec  5 23:31:47 PST 2013
4: Thu Dec  5 23:31:48 PST 2013
5: Thu Dec  5 23:31:49 PST 2013
6: Thu Dec  5 23:31:50 PST 2013
7: Thu Dec  5 23:31:51 PST 2013

它一直持续到您终止它。

下面是一种使用子流程模块逐行处理c(或shell)程序输出的方法:

from subprocess import Popen, PIPE
# Set up the process
p = Popen("yourprogram", stdout=PIPE, close_fds=True)
count = 0
while True:
    count += 1
    print '%s: %s' % (count, p.stdout.readline().strip())
出于演示目的,
yourprogram
可以是一个简单的shell脚本(设置了可执行位):

运行python程序会产生:

$ python test.py
1: Thu Dec  5 23:31:45 PST 2013
2: Thu Dec  5 23:31:46 PST 2013
3: Thu Dec  5 23:31:47 PST 2013
4: Thu Dec  5 23:31:48 PST 2013
5: Thu Dec  5 23:31:49 PST 2013
6: Thu Dec  5 23:31:50 PST 2013
7: Thu Dec  5 23:31:51 PST 2013

它会一直持续到您终止为止。

谢谢您的回复,但就像stackoverflow上的其他解决方案一样,您的解决方案在阅读行之前仍然需要完成“yourCprogram”,这不是我所需要的。@Kamarkaka这是不正确的。在这个解决方案中,“yourCprogram”确实与python程序并行运行。两者独立运行,但通过管道连接。@Kamarkaka您所看到的另一个代码可能有等待语句(例如
p.wait()
),这迫使python代码等待“yourCprogram”结束。我没有包括上面的一个,这就是为什么这两个程序可以继续并行运行的原因。我尝试了你的代码,但它确实要等到C程序完成。如果我将C程序设置为无限运行,没有任何东西会永远返回…我知道这很奇怪,你能想到什么可能的原因吗?@Kamarkaka,很抱歉!在匆忙中,我假设读线的行为就像一个生成器。没有。我现在已经修复了代码。感谢您的回复,但就像stackoverflow上的其他解决方案一样,您的解决方案在阅读行之前仍然需要完成“yourCprogram”,这不是我所需要的,这是不正确的。@Kamarkaka这是不正确的。在这个解决方案中,“yourCprogram”确实与python程序并行运行。两者独立运行,但通过管道连接。@Kamarkaka您所看到的另一个代码可能有等待语句(例如
p.wait()
),这迫使python代码等待“yourCprogram”结束。我没有包括上面的一个,这就是为什么这两个程序可以继续并行运行的原因。我尝试了你的代码,但它确实要等到C程序完成。如果我将C程序设置为无限运行,没有任何东西会永远返回…我知道这很奇怪,你能想到什么可能的原因吗?@Kamarkaka,很抱歉!在匆忙中,我假设读线的行为就像一个生成器。没有。我现在已经修好了密码。你试过了吗?这是一个更好的模拟。另请参见备注:如果可以修改C程序;您可以添加
setvbuf(stdout,(char*)NULL,_IOLBF,0)(使程序行处于缓冲状态,不管它是打印到终端还是另一个程序(管道)),以便在C语言中打印每一行后立即获取它。您从中尝试过吗?这是一个更好的模拟。另请参见备注:如果可以修改C程序;您可以添加
setvbuf(stdout,(char*)NULL,_IOLBF,0)(使程序行处于缓冲状态,不管它是打印到终端还是另一个程序(管道)),以便在C中打印完每一行后立即获得它。