使用python GUI实时捕获外部C程序的输出

时间:2012-07-09 23:40:58

标签: python c user-interface subprocess popen

我有一个线程C程序,我想在Unix环境中使用Python GUI启动。我希望能够通过从C程序收集输出来更改GUI的状态。

例如,这是使用printf:

从我的C程序输出的
Thread on tile 1: On
Thread on tile 2: OFF
Thread on tile 3: Disable
...
Thread on tile 61: ON

我会根据输出更新我的GUI。使问题困难的是我的GUI和C程序需要同时运行并且实时更新。我还需要能够从我的GUI向C程序发送命令。

我是Python,C和Unix的新手(我知道,完全是新手状态)。 我已经阅读过subprocess,Popen和pexpect,但不知道如果可能的话,如何将它们全部放在一起。

提前致谢

3 个答案:

答案 0 :(得分:2)

方法的基本概要是让你的python GUI用C程序创建一个新进程,然后在C程序写入管道的另一端时从管道的一端读取python GUI 。 python GUI将读取C程序的输出,解释输出,然后根据读取的内容执行某些操作。

Multiprocessing with Python

How to fork and return text with Python

Recipe to fork a daemon process on Unix

食谱文章有关于重定向标准输入和标准输出的注释,您可能需要这样做。

答案 1 :(得分:1)

这是一个艰难的过程。我过去遇到过这个问题(没有真正令人满意的解决方案):

https://groups.google.com/forum/?fromgroups#!topic/comp.lang.python/79uoHgAbg18

正如那里所建议的那样,看看这个自定义模块:

http://pypi.python.org/pypi/sarge/0.1
http://sarge.readthedocs.org/en/latest/

编辑@Richard(没有足够的回复评论):管道问题是除非它们连接到交互式终端,否则它们是完全缓冲的 - 意味着没有输出通过管道传递给Python直到C prog完成了运行,这当然不具备实时性。

编辑2:基于Richard的链接以及我之前做过的一些思考,我想到可以手动循环管道,将其视为文件对象并且只读取一行一时间:

from time import sleep
# Assume proc is the Popen object
wait_time = 1 # 1 second, same delay as `tail -f`
while True: # Or whatever condition you need
    line = proc.stdout.readline()
    if line != '' and line != '\n':
        parse_line_do_stuff()

    sleep(wait_time)

这假设readline()是非阻塞的,并且进一步假设管道最多是行缓冲的,即使这样也可能不起作用。我从未尝试过。

答案 2 :(得分:0)

您有两个进程,并且希望它们进行通信。这被称为“进程间通信”甚至是IPC。如果您使用谷歌进行“进程间通信”,您可以找到一些信息,如:

http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html

您可能想尝试使用“域套接字”来在C程序和Python GUI之间进行通信。上面链接的指南解释了如何通过C中的域套接字进行通信;这是一个使用Python通过域套接字进行交谈的教程。

http://www.doughellmann.com/PyMOTW/socket/uds.html