"'模块'没有属性"使用namedtuples时

时间:2016-08-01 04:47:28

标签: python collections queue namedtuple

我在这里碰到了一堵墙,所以我会尽力解释这个问题。

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 thing之上,并且它有效!

但是,在没有Job = collections ...移动的情况下编写代码的方式在我的Ubuntu系统上运行得非常好。

所以Windows7使用python2.7.8它不起作用    使用python2.7.6的Ubuntu14确实有效    使用python3.4.3的Ubuntu14确实有效

我必须在这里遗漏一些东西......

完全跟踪在这里:

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 个答案:

答案 0 :(得分:1)

在Windows上,多处理的实现对代码施加了额外的约束 - 实际上会发生的事情是为每个进程启动不同的python解释器,然后这些新的解释器将python代码加载为非主要 - 因此,要使用Job,非主进程需要在if __name__=='__main__'条件语句之外定义Job。见https://docs.python.org/2/library/multiprocessing.html下面的标题16.6.3.2