1

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

例如,这是我的 C 程序使用 printf 的输出:

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,但不确定如何将它们放在一起,如果这甚至可能的话。

提前致谢

4

3 回答 3

2

一种方法的基本概述是让您的 python GUI 使用 C 程序创建一个新进程,然后让 python GUI 从管道的一端读取,而 C 程序正在写入管道的另一端。python GUI 将读取 C 程序的输出,解释输出,然后根据它读取的内容做一些事情。

使用 Python 进行多处理

如何使用 Python 分叉和返回文本

在 Unix 上 fork 守护进程的秘诀

食谱文章有关于您可能需要做的标准输入和标准输出重定向的评论。

于 2012-07-10T00:02:10.827 回答
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(没有足够的代表发表评论):管道的问题在于,除非它们连接到交互式终端,否则它们是完全缓冲的——这意味着在 C prog 之前没有任何输出通过管道传递到 Python已完成运行,这当然不符合实时条件。

编辑2:根据理查德的链接和我之前的一些想法,我想到可以通过将管道视为文件对象并一次只读取一行来手动循环管道:

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() 是非阻塞的,并进一步假设管道最多是行缓冲的,即使那样它也可能不起作用。我从来没有尝试过。

于 2012-07-10T00:04:32.963 回答
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

于 2012-07-10T00:25:21.310 回答