【问题标题】:python read from shell command outputpython从shell命令输出中读取
【发布时间】:2013-12-05 07:03:27
【问题描述】:

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

目前,我有一个 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程序需要该位置做一些进一步的处理。

谢谢。

【问题讨论】:

标签: python shell subprocess


【解决方案1】:

这是一种使用 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

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

【讨论】:

  • 感谢您的回复,但就像 stackoverflow 上的其他人一样,您的解决方案仍然需要在阅读行之前完成“yourCprogram”,这不是我所需要的。
  • @Kamarkaka 那不正确。在这个解决方案中,“yourCprogram”确实与 python 程序并行运行。两者独立运行,但通过管道连接。
  • @Kamarkaka 你看过的其他代码可能有等待语句(例如p.wait()),它迫使python代码等待“yourCprogram”结束。我没有包括上面的一个,这就是为什么这两个程序可以继续并行运行。
  • 我试过你的代码,但它真的要等到 C 程序完成。如果我将 C 程序设置为无限运行,则什么都不会永远返回……我知道这很奇怪,你能想到任何可能的原因吗?
  • @Kamarkaka,对此感到抱歉!匆忙中,我假设 readlines 的行为就像一个生成器。它没有。我现在已经修复了代码。
猜你喜欢
  • 2017-12-15
  • 1970-01-01
  • 2020-03-25
  • 2016-04-21
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
相关资源
最近更新 更多