我有一个线程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,但不知道如果可能的话,如何将它们全部放在一起。
提前致谢
答案 0 :(得分:2)
方法的基本概要是让你的python GUI用C程序创建一个新进程,然后在C程序写入管道的另一端时从管道的一端读取python GUI 。 python GUI将读取C程序的输出,解释输出,然后根据读取的内容执行某些操作。
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通过域套接字进行交谈的教程。