2017-05-09 29 views
2

如果我有一个python脚本运行(全文Tkinter的GUI和一切),我想通过它收集实时数据(存储在内部阵列和这样的)到另一个python脚本,这样做的最好方法是什么?Python脚本之间传递数据,而单独运行

我不能简单地导入剧本一到脚本B,因为它会创建脚本A的新实例,而不是在已经运行的脚本A.

我觉得这样做是唯一的方式访问任何变量通过让脚本A写入文件,然后脚本B从文件中获取数据。这是不太理想但仿佛脚本B试图读取文件的脚本A在已经写会出事。我又找了更快的速度向两个程序之间的通信。

编辑: 这里是要求的例子。我知道为什么,这并不工作,但它是需要达到什么样的基本前提。我的源代码很长,不幸的是保密,所以它不会在这里帮助。总之,一个脚本运行的Tkinter和收集数据,而脚本B是views.py作为Django的一部分,但我希望可以做到这一点像Python的一部分。

脚本A

import time 

i = 0 

def return_data(): 
    return i 

if __name__ == "__main__": 
    while True: 
     i = i + 1 
     print i 
     time.sleep(.01) 

脚本B

import time 
from scriptA import return_data 

if __name__ == '__main__': 
    while True: 
     print return_data() # from script A 
     time.sleep(1) 
+0

您应该能够导入一个模块到另一实例的单个实例(如果有必要使用单),然后将属性/值分配给此实例,以便您可以根据需要在辅助脚本中读取它。 – JacobIRR

+0

如果脚本不是太长或敏感的,这将有助于看到源代码 – JacobIRR

+0

也许你可以使用文件插座?这似乎是流式传输数据的一种选择。 – Evert

回答

7

可以使用multiprocessing模块来实现在两个模块之间的Pipe。然后,您可以启动其中一个模块作为Process,并使用Pipe与其通信。关于使用管道的最好的部分是你也可以传递像dict,list这样的python对象。

例如: mp2.py:

from multiprocessing import Process,Queue,Pipe 
from mp1 import f 

if __name__ == '__main__': 
    parent_conn,child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) 
    p.start() 
    print(parent_conn.recv()) # prints "Hello" 

mp1.py:

from multiprocessing import Process,Pipe 

def f(child_conn): 
    msg = "Hello" 
    child_conn.send(msg) 
    child_conn.close() 
+0

这似乎是要走的路,但为什么以下工作不成功?如果将此代码添加到mp1.py的末尾:'I = 0 DEF克(): 打印我 如果__name__ == “__main__”: 而真: I = I + 1 克( ) '为什么不运行mp2.py返回当前的i? –

+0

没有完全理解你的问题。但是如果你想调用函数g(),你需要在'p = Process(target = g,args =(child_conn,))中指定它' –

+0

查看编辑中的例子,如果你插入你的代码,mp2将返回0而不是我在mp1中的任何内容。 –