python从shell命令输出中读取

标签 python shell subprocess

我理解您可能认为这是一个重复的问题,但到目前为止我还没有找到解决我自己问题的方法。

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

C程序主要感觉是这样的:

int i = 0;
while(1){
    printf("%d %d\n", i, i+1);
    i++;
}

我阅读并尝试了Python中的子进程,似乎它们都需要等待命令完成。(例如:Constantly print Subprocess output while process is running)我希望有一些缓冲机制,这样我就可以记录这个位流并按行处理它线。谢谢。

几个假设:

1) 处理过的行可以被丢弃

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

更多背景信息: C 程序基本上驱动相机输入(这就是它用 C 编写的原因),执行一些 OpenCV 操作并输出对象位置 (x, y) int 值。 python程序需要这个位置来进行一些进一步的处理。

谢谢。

最佳答案

下面是使用 subprocess 模块逐行处理 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 脚本(设置了可执行位):

#!/bin/sh
while sleep 1s
do
    date
done

运行 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

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

关于python从shell命令输出中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20393534/

相关文章:

python - 由于 Errno 1,无法使用 '--always-copy' 标志设置 virtualenv

Python:列出过去 24 小时内创建的具有特定扩展名的子目录中的文件

python - 如何将状态表映射到numpy中的生命表?

security - 如何判断shell脚本是否安全

python - 通过 python 子进程 sshing 后终端挂起

opencv - 图像倾斜 - 无法使用 CV2 检测水平线

java - 是否可以在 Spring Shell 中对值进行制表符补全?

shell - 如何否定进程的返回值?

python - 如何在使用 subprocess.Popen 并同时隐藏 cmd 窗口时设置输出文件?

python - 子进程模块、envoy、sarge 和 pexpect 之间的区别?