2017-05-09 33 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中的任何內容。 –