2016-08-01 19 views
0

我在這裏遇到了一堵牆,所以我會盡我所能解釋這個問題。「'module'沒有任何屬性」當使用namedtuples時

def playGames(jobQueue, ...): 
    .... 
    nextJob = jobQueue.get() 
    ... 

def runPool(fens, timesetting, ...): 
    ... 
    for fen in fens: 
    jobQueue.put(Job(gamefen=fen, timecontrol=timesetting)) 
    ... 

if __name__ == '__main__': 
    Job = collections.namedtuple('Job', 'gamefen timecontrol') 
    ... 
    ... 
    playGames(jobQueue, ...) # jobQueue is a multiprocess.Queue() object 

運行此操作後,會引發以下錯誤。

"'module' object has no attribute 'Job'" 

因此,我將Job = collections ...行移到了if name == main事件上面,它工作正常!

但是,代碼編寫的方式沒有Job = collections ...移動在我的Ubuntu系統上將工作得很好。

所以Windows7的使用python2.7.8它不使用python2.7.6它的工作 Ubuntu14使用python3.4.3工作 Ubuntu14它的工作

我必須缺少的東西在這裏...

THE FULL TRACEBACK是在這裏:

Traceback (most recent call last): 
    File "c:\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "c:\Python27\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "c:\Users\Andy\Desktop\Github\LucasZinc\Zinc.py", line 338, in play_games 
    _job = jobQueue.get() 
    File "c:\Python27\lib\multiprocessing\queues.py", line 117, in get 
    res = self._recv() 
AttributeError: 'module' object has no attribute 'Job' 
+1

請顯示完整的錯誤信息和完整的回溯。 – BrenBarn

+0

添加了追溯 – AndrewGrant

回答

1

在Windows上,在碼多重處理的地方附加約束的執行 - 有效地發生的事情是不同的Python解釋器啓動每個PROC ess,然後這些新的解釋器將python代碼加載爲非主 - 所以,要使用Job,非主進程需要在if __name__=='__main__'條件語句之外定義Job。見下面的標題16.6.3.2 https://docs.python.org/2/library/multiprocessing.html

+0

您確定您擁有標題編號正確嗎? – AndrewGrant

+1

更正,謝謝 – barny

+0

優秀。這個理由很有道理;很高興看到它的來源。謝謝你的時間!一旦時間到期,我會接受答案。 – AndrewGrant

相關問題