Python多处理错误:AttributeError:模块'__main__'没有属性'__spec__'
Posted
技术标签:
【中文标题】Python多处理错误:AttributeError:模块\'__main__\'没有属性\'__spec__\'【英文标题】:Python Multiprocessing error: AttributeError: module '__main__' has no attribute '__spec__'Python多处理错误:AttributeError:模块'__main__'没有属性'__spec__' 【发布时间】:2018-01-24 23:39:48 【问题描述】:我正在使用 Python 3.6,并尝试遵循下面网站上的第一个示例(完整代码也在下面),并收到以下错误: https://docs.python.org/3.6/library/multiprocessing.html
错误信息:
AttributeError: module '__main__' has no attribute '__spec__'
完整示例代码:
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))
我尝试用谷歌搜索它并搜索 Stack Overflow,但我只发现了另一种此错误的情况,但没有答案。
【问题讨论】:
发布的代码在我的机器上运行良好 我正在使用 Anaconda / Spyder 和 Python 3.6... 也许这与它有关? 我在 Windows 7 中使用 Spyder 3.1.2 和 Python 3.6.0 (Anaconda 4.3.1) 我使用的是 Spyder 3.1.4。当我从命令提示符运行脚本时,我发现代码有效,但在 Spyder 中出现错误。知道是否有任何配置步骤可以使 Spyder 很好地与多处理配合使用? Python 解释器设置为“默认(即与 Spyder 的相同)”。我将 Anaconda 的设置更改为在外部系统终端中运行,它运行良好。关于 IPython 控制台的某些内容正在引发错误。 【参考方案1】:pdb 用户
这个问题没有特别提到 Spyder 或 Conda(尽管它被标记为这样)。因此,我会注意到我发现在使用 pdb 时也会发生这种情况。
例如
python -m pdb myprogram.py
如果您想坚持使用 pdb,传递 __spec__ = None
将是一个有用的解决方法。
【讨论】:
【参考方案2】:当我尝试外部终端时,Spyder(Anaconda3,python 3.6)中的相同问题。
Error message: AttributeError: module '__main__' has no attribute '__spec__'
我将运行控制台更改为“在当前控制台中执行”,并应用了它。
然后如果这不起作用,请尝试其他 conselor,然后改回“在当前控制台中执行”。
最后,它起作用了。
不需要'__spec__ = None'
。
【讨论】:
【参考方案3】:问题不在于代码/Python 3.6,而在于 Spyder。
经过一番调查,我发现代码在外部系统终端中执行时运行良好,但在 Spyder 的 IPython 控制台中运行时却不行。
我能够转储 spec 的内容并将它们分配给包含在 main 中的变量,以允许该代码在 IPython 控制台中运行。 p>
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
__spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)"
with Pool(5) as p:
print (p.map(f, [1, 2, 3]))
【讨论】:
我真的很惊讶它的工作原理,因为__spec__
通常不是一个字符串。由于它确实有效,您可能只使用None
。
我尝试了__spec__ = __spec__
,我的子进程开始无限启动和停止。当脚本在系统终端中启动时,我还检查了__spec__
变量。它是None
。所以我认为__spec__ = None
是解决这个问题的“正确”方法。
祝福你,Winand。我真的很高兴我尝试在我自己的代码之前执行 pythondocs 示例。得到了这个签名,成功运行了 "spec = None" 这个问题会让我无限生气。以上是关于Python多处理错误:AttributeError:模块'__main__'没有属性'__spec__'的主要内容,如果未能解决你的问题,请参考以下文章