我有两个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将数据保存到文件中(也许可以腌制它?)并要求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代码,通过计时器来更新图形并使其滚动
答案 0 :(得分:1)
您可以选择其中任何一种方法:
将程序加入单线程程序,使用计时器检查新数据,并在数据到达时重新编译:
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')