Python多处理错误:AttributeError:模块'__main__'没有属性'__spec__'

use*_*060 17 python multiprocessing spyder python-multiprocessing

我正在使用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]))
Run Code Online (Sandbox Code Playgroud)

我尝试使用Google搜索并搜索Stack Overflow,但我只发现了另一个此错误的情况并且没有答案.

use*_*060 26

问题不在于代码/ Python 3.6,而在于Spyder.

经过一些调查后,我发现代码在外部系统终端中执行时运行正常,但在Spyder的IPython控制台中运行时却没有.

我能够转储spec的内容并将它们分配给main中包含的变量,以允许此代码在IPython控制台中运行.

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]))
Run Code Online (Sandbox Code Playgroud)

  • 我试过`__spec__ = __spec__`,我的子进程开始无限启动.在系统终端中启动脚本时,我还检查了`__spec__`变量.这是"无".所以我认为`__spec__ = None`是解决这个问题的"正确"方法. (7认同)
  • 我真的感到惊讶,因为`__spec__`通常不是字符串.既然它确实有效,你可以使用"无". (6认同)

Joe*_*eyC 16

pdb用户

这个问题没有特别提到 Spyder 和 Conda(尽管它被标记为这样)。因此,我会注意到我发现在使用 pdb 时也会发生这种情况。

例如

python -m pdb myprogram.py

__spec__ = None如果您想坚持使用 pdb,传递将是一个有用的解决方法。