0

私はPythonで2つのプログラムを持っています。それらを Prog1.py および Prog2.py と呼びましょう。Prog1 は、外部デバイスからライブ データを取得するのに役立ちます。現在、データを取得すると、画面に出力されます。while ループが実行され、各反復で取得した新しいデータ セットが出力されます。現在、Prog2 は PyQtGraph を使用して構築された Python プログラムであり、モニターのようにリアルタイムでデータをプロットすることを目的としています。現在、Prog2 が行うことは (つまり、個別に実行する場合)、既に取得したデータをプロットすることです。これは動くプロットです。そのため、Prog2.py には、指定された間隔でタイマーによって繰り返し呼び出される update 関数があり、次のデータ ポイントでグラフを更新します (グラフを右に移動させるため)。

Prog1 と Prog2 は、独自のイベント ループ プロセスを持つ独立したイベントであるため、それらをリンクする方法がわかりません。私が考えた単純なアイデアの 1 つは、Prog1.py と Prog2.py を並行して実行し、Prog1.py にデータをファイルに保存するように依頼し (おそらくピクル?)、Prog2.py にデータを読み取らせてからグラフをプロットするように依頼することでした。しかし、私はこれに納得していません。これは汚れているように見えます。どういうわけか、Prog1.py 内で Prog2.py コード全体を実行したいと考えています。これを行うためのきれいな方法はありますか?

編集 - コード

Prog1.py

/*

Code to get data from USB

*/

def main():
    while 1:
        data = get_data()
        print data

main()

Prog2.py は、タイマーを介してグラフを更新し、スクロールさせる PyQtGraph コードです。

4

1 に答える 1

1

いくつかのオプションがありますが、おそらくどれでも機能します。

  1. プログラムを 1 つに結合し、データを監視してプロットのためにメイン スレッドに送り返すワーカー スレッドを使用します。(参照: https://groups.google.com/forum/#!msg/pyqtgraph/haiJsGhxTaQ/RkOov_UZEcYJ )
  2. 新しいデータをチェックし、データが到着するたびに再プロットするタイマーを使用して、プログラムをシングルスレッド プログラムに結合します。

    plt = pg.plot()
    def update():
        data = getNewData()
        if data is not None:
            plt.plot(data, clear=True)
    timer = QTimer()
    timer.timeout.connect(update)
    timer.start(10)
    
  3. プログラムを別々に保ち、何らかの形式の IPC (ソケット、パイプなど) を使用してそれらの間で通信します。これには、データのシリアル化が含まれます(おそらく、あなたが示唆するように、ピクルを使用します)。pyqtgraph.multiprocessプロセス間で Qt シグナルを送信することもできます。これはおそらく最も難しいオプションですが、簡単な例を次に示します。

    import pyqtgraph as pg
    import pyqtgraph.multiprocess as mp
    proc = mp.QtProcess() # start second process for plotting
    rpg = proc._import('pyqtgraph') 
    plt = rpg.plot() # create a PlotWidget in remote process
    
    # Unlike the last example, we can use a wile-loop here because the Qt
    # event loop is running in another process.
    while True:
        data = getNewData()
        if data is not None:
            plt.plot(data, clear=True, _callSync='off')
    
于 2014-06-21T03:36:39.490 に答える