0

我有两个 Python 程序。我们称它们为 Prog1.py 和 Prog2.py 。Prog1 正在帮助我从外部设备获取实时数据。到目前为止,当它获得数据时,它会在屏幕上打印出来。有一个 while 循环在运行,在每次迭代中它都会打印出获取的新数据集。现在 Prog2 是一个使用 PyQtGraph 构建的 Python 程序,旨在像监视器一样实时绘制数据。截至目前,Prog2 所做的是(即,当它单独运行时),它绘制已经获取的数据。这是一个动人的情节。所以 Prog2.py 有一个更新函数,它被定时器以指定的时间间隔重复调用,以便用下一个数据点更新图形(使其向右移动)。

由于 Prog1 和 Prog2 是具有自己的事件循环过程的独立事件,我不确定如何链接它们。我认为一个天真的想法是并行运行 Prog1.py 和 Prog2.py 并要求 Prog1.py 将数据保存到文件中(也许腌制它?)并要求 Prog2.py 从中读取然后绘制图形。但我不相信这一点。这看起来很脏。不知何故,我想在 Prog1.py 中运行整个 Prog2.py 代码。有没有一种干净的方法可以做到这一点?

编辑-代码

程序1.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. 将程序合二为一,使用一个工作线程来监视数据并将其发送回主线程进行绘图。(见: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——套接字、管道等在它们之间进行通信。这将涉及对数据进行序列化(如您所建议的,可能使用 pickle)。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 回答