簡體   English   中英

使用python GUI實時捕獲外部C程序的輸出

[英]Capture output from external C program with python GUI in realtime

我有一個線程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,但不知道如何將它們全部放在一起,如果這甚至可能的話。

提前致謝

一種方法的基本概要是讓你的python GUI用C程序創建一個新進程,然后在C程序寫入管道的另一端時從管道的一端讀取python GUI。 python GUI將讀取C程序的輸出,解釋輸出,然后根據它讀取的內容執行某些操作。

使用Python進行多處理

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

配方在Unix上分叉守護進程

食譜文章有關於重定向標准輸入和標准輸出的注釋,您可能需要這樣做。

有一種頑固態度。 我過去遇到過這個問題(沒有真正令人滿意的解決方案):

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編譯之前,沒有任何輸出通過管道傳遞給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()是非阻塞的,並且進一步假設管道最多是行緩沖的,即使這樣它也可能不起作用。 我從來沒有嘗試過。

您有兩個進程,並且希望它們進行通信。 這被稱為“進程間通信”甚至是IPC。 如果您使用谷歌進行“進程間通信”,您可以找到一些信息,如下所示:

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

您可能想嘗試使用“域套接字”來在C程序和Python GUI之間進行通信。 上面鏈接的指南解釋了如何通過C中的域套接字進行通信; 這是一個使用Python通過域套接字進行通信的教程。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM