2010-05-05 44 views
12

我遇到下面的代碼以及在子進程中使用print函數的任何代碼的問題。即使我使用sys.std[err|out].write('worker')而不是print,我也看不到任何打印報表。使用python多重處理模塊創建的子進程將不會打印

這是代碼(from the official python documentation):

from multiprocessing import Process 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

輸出是空白。

注意:下面的代碼使用線程模塊,並將其打印輸出:

import threading 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = threading.Thread(target=f, args=('bob',)) 
    p.start() 
    p.join() 

輸出hello bob

能否請你點我的解決方案嗎?提前致謝。

回答

19

嘗試這種情況:

from multiprocessing import Process 
import sys 

def f(name): 
    print 'hello', name 
    sys.stdout.flush() 

... 

AFAIK由multiprocessing模塊處理衍生的標準輸出進行緩衝,因此,你將看到的輸出僅當緩衝器變滿或顯式沖洗sys.stdout

+0

非常感謝Tamas,但這在我的情況下沒有工作... – John 2010-05-05 16:18:17

+0

你在哪個平臺上?上面的作品適用於Mac OS X上的我;事實上,即使沒有刷新sys.stdout,它也能正常工作。 – 2010-05-05 17:37:29

+1

Tamas,我正在使用的平臺是win32。 順便說一下,直到現在我試圖在IDLE內運行代碼。今天我試着從命令行運行它,使用這個語法: python.exe my_prog.py 它工作。 有人知道爲什麼嗎?如何通過在IDLE內運行程序來顯示打印輸出? – John 2010-05-06 08:12:34

3

多處理文檔清楚地解釋了why這不會工作!

「注意:這個包中的功能需要__main__方法可以由子項導入,這在編程指南中有所介紹,但這裏值得指出,這意味着一些例子,比如multiprocessing.Pool例子將會不在交互式口譯員工作。「

+0

首先感謝您的答案。 我所做的是將代碼寫入名爲「example.py」的文件中,然後按F5運行它。也許這意味着「在IDLE內運行代碼」? PS:我是一個蟒蛇新手,很抱歉我可能在這裏陳述過的任何(過分)明顯的事情。 – John 2010-05-13 10:22:29

+0

啊,是的,帶「>>」提示的IDLE算作交互式解釋器。因此,多處理基本上不會工作,除非您將代碼寫入文件並按照您所說的按F5或在命令提示符下鍵入「python example.py」。我可以理解這可能是一個令人困惑的問題。別客氣。 – manifest 2010-05-18 18:26:09

-2

獲取PyCharm,我有同樣的錯誤,並在它上面工作了+ -5個小時。最後,我通過Anaconda獲得了Pycharm,並獲得了輸出。它與IPhython解釋器的windows版本有關。