我有两个Python程序。我们称它们为Prog1.py和Prog2.py。Prog1正在帮助我从外部设备获取实时数据。到目前为止,当它获得数据时,它会在屏幕上打印出来。有一个while循环在运行,在每次迭代中,它打印出获取的新数据集。现在,Prog2是一个使用PyQtGraph构建的Python程序,它旨在像监视器那样实时绘制数据。到目前为止,Prog2所做的是(也就是说,当它单独运行时)绘制已经获得的数据。这是一个感人的情节。所以Prog2.py有一个更新函数,它被计时器以指定的间隔重复调用,以便用下一个数据点更新图(使其向右移动)。我的目标是连接Prog1和Prog2——也就是说,我想把Prog1实时获取的数据管道到Prog2,这样Prog2就可以实时绘制数据。
由于Prog1和Prog2是独立的事件,有自己的事件循环过程,我不确定如何链接它们。我想到的一个天真的想法是并行运行Prog1.py和Prog2.py,并要求Prog1.py将数据保存到一个文件中(可能pickle它?)并让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代码,通过计时器更新图形并使其滚动
您有几个选项,可能其中任何一个都可以:
- 将程序合并为一个,使用一个工作线程监视数据并将其发送回主线程进行绘图。(参见:https://groups.google.com/forum/!味精/pyqtgraph haiJsGhxTaQ/RkOov_UZEcYJ)
-
将程序连接到单线程程序中,使用计时器检查新数据,并在数据到达时重新绘制:
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)
-
保持程序分离,并使用某种形式的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')