我正在使用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]))
我尝试谷歌搜索它并搜索堆栈溢出,但我只发现了此错误的另一种情况,它没有答案。
问题不在于代码/Python 3.6,而在于Spyder。
经过一些调查,我发现代码在外部系统终端中执行时运行良好,但在Spyder的IPython控制台中运行时则不然。
我能够转储规范的内容并将它们分配给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]))
PDB 用户
这个问题没有特别提到Spyder或Conda(尽管它被标记为这样(。因此,我会注意到我发现在使用 pdb 时也会发生这种情况。
例如
python -m pdb myprogram.py
如果要坚持使用 pdb,传递__spec__ = None
将是一个有用的解决方法。
当我尝试外部终端时,Spyder(Anaconda3,python 3.6(中也出现了同样的问题。
Error message: AttributeError: module '__main__' has no attribute '__spec__'
我将"运行"控制台更改为"在当前控制台中执行",并应用了它。 然后,如果这不起作用,请尝试其他 conselor,然后更改回"在当前控制台中执行"。 最后,它起作用了。 不需要'__spec__ = None'
。
Spyder(Anaconda3,python 3.7(也有同样的问题。
我用了
from genetic_selection import GeneticSelectionCV
def main((: .... 当我运行代码时,发生了这样的错误:
main_mod_name = getattr(main_module.__spec__, "name", None)
AttributeError: module '__main__' has no attribute '__spec__'
我所做的在main_mod_name = getattr(main_module.__spec__, "name", None)
中删除"__spec__"
所以我只有这个:main_mod_name = getattr(main_module, "name", None)
然后代码工作得很好。
我在研究这个错误时偶然发现了这个问题。我发现跑步
with Pool() as mp_pool:
导致错误。将其更改为:
if __name__ == '__main__':
__spec__ = None
with Pool() as mp_pool:
解决了。蟒蛇 3.11.4.Fix与Spyder或Anaconda无关。