1

Unix 環境で Python GUI を使用して起動したいスレッド化された C プログラムがあります。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 の初心者です (完全な新人ステータスであることは知っています)。サブプロセス、Popen、および pexpect について調べましたが、これが可能であるかどうかについて、すべてをまとめる方法がわかりません。

前もって感謝します

4

3 に答える 3

2

アプローチの基本的な概要は、Python GUIでCプログラムを使用して新しいプロセスを作成し、Cプログラムがパイプのもう一方の端に書き込んでいる間にPythonGUIでパイプの一方の端から読み取りを行うことです。Python GUIは、Cプログラムからの出力を読み取り、出力を解釈して、読み取った内容に基づいて何かを実行します。

Pythonによるマルチプロセッシング

Pythonでテキストをフォークして返す方法

Unixでデーモンプロセスをフォークするレシピ

レシピの記事には、標準インと標準アウトのリダイレクトを行う必要があるかもしれないというコメントがあります。

于 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 を編集 (コメントするには十分な担当者がいません): パイプの問題は、パイプがインタラクティブな端末に接続されていない限り、完全にバッファリングされることです。これは確かにリアルタイムとは言えません。

編集2:リチャードのリンクと私が行った以前の考えに基づいて、パイプをファイルオブジェクトとして扱い、一度に1行だけ読み取ることで、パイプを手動でループできる可能性があることに気づきました。

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

2 つのプロセスがあり、それらが通信する必要があります。これは「プロセス間通信」または IPC としても知られています。「プロセス間通信」を Google で検索すると、次のような情報が見つかります。

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 に答える