2011-08-21 36 views
1

爲Python中的調用過程提前返回一個值?如何將來自子腳本的值傳遞給同時運行的父腳本?

你好,我想問問有沒有辦法讓一個腳本調用另一個腳本,讓這兩個腳本同時運行,並讓子腳本在父腳本早些時候發送一個值到子腳本之前完成運行(不提前退出該子腳本)?我正在尋找Python的解決方案,但任何信息或線索都會有所幫助,謝謝。

我認爲這樣做的一種方法是打印您想要發送回父腳本的值到標準輸出,然後讓父腳本重定向它或拾取它的一些方法,但必須有一個更好的解決方案,因爲如果子腳本打印其他東西會怎麼樣? (那麼父級腳本必須知道如何用Unix頭部和尾部命令來分離輸出的確切部分,以及如果您根本不想使用標準輸出?)

我已經搜索在這方面的答案,但我找不到任何。

回答

3

您可以使用multiprocessing從父腳本啓動子腳本。 A mp.Queue可用於將子腳本的輸出傳遞迴父級。下面是一個簡單的例子:

parent.py

import multiprocessing as mp 
import child 

if __name__ == '__main__': 
    queue = mp.Queue() 
    proc = mp.Process(target=child.main, args=(queue,)) 
    proc.daemon = True 
    # This launches the child process, calling child.main() 
    proc.start()   
    for i in range(10): 
     result = queue.get() # Get results from child.main 
     print(result) 

child.py

import time 

def main(queue=None): 
    for i in range(10): 
     # do a computation 
     result = i 
     if queue: 
      # Put a result in the queue for the parent to get 
      queue.put(result) 
     time.sleep(.5) 

if __name__=='__main__': 
    # We reach here only when child.py is run as a script 
    # (as opposed to child being imported as a module). 
    main() 

注意,通過queue通過result必須picklable。

+0

謝謝你這個答案,但現在我想弄清楚parent.py如何知道啓動child.py腳本而不是其他腳本?,因爲我沒有看到名稱「child.py」在「parent.py」腳本的任何地方都可以提到。 – user904542

+0

parent.py腳本不運行child.py腳本。相反,它只運行一個函數'child.run'。但是這不是真正的限制,因爲您可以輕鬆將腳本的所有動作放入函數中。一些小的重構應該允許你將'child.py'作爲一個獨立的腳本運行,並且還可以導入並調用'child.run'。我會編輯我的答案(希望)澄清我的意思。 – unutbu

+0

我明白了,謝謝。 – user904542

相關問題