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 的内容并将它们分配给包含在 ma​​in 中的变量,以允许该代码在 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__'的主要内容,如果未能解决你的问题,请参考以下文章

RuntimeError:python 多处理错误

使用星图的python多处理和pickle错误?

Windows 上的 Python 多处理运行时错误

Python中的多处理错误

序列图变换 - Python SGT 多处理中的错误

Python - 运行多个使用多处理的 python 脚本有时会影响性能和错误