ModuleNotFoundError:没有名为'__main __。xxxx'的模块; '__main__'不是包

问题描述 投票:31回答:3

目前正在尝试使用Python3并使用绝对导入将一个模块导入另一个模块但我得到错误ModuleNotFoundError: No module named '__main__.moduleB'; '__main__' is not a package。考虑这个项目结构:

proj
    __init__.py3 (empty)
    moduleA.py3
    moduleB.py3

moduleA.py3

from .moduleB import ModuleB
ModuleB.hello()

moduleB.py3

class ModuleB:
    def hello():
        print("hello world")

然后运行python3 moduleA.py3给出错误。这里有什么需要改变的?

python-3.x import module
3个回答
30
投票

.moduleB是相对进口的。相对仅在首先导入或加载父模块时有效。这意味着您需要在当前运行时环境中的某处导入proj。当您使用命令python3 moduleA.py3时,它没有机会导入父模块。您可以:

  • from proj.moduleB import moduleB
  • 你可以创建另一个脚本,比如run.py,来调用from proj import moduleA

祝你旅途愉快,前往Python的绝佳之地。


10
投票

除了md-sabuj-sarker的答案之外,Python modules documentation还有一个非常好的例子。

这就是文档对intra-package-references的看法:

请注意,相对导入基于当前模块的名称。由于主模块的名称始终是"__main__",因此用作Python应用程序主模块的模块必须始终使用绝对导入。

如果你运行python3 moduleA.py3moduleA被用作主模块,所以使用绝对导入看起来是正确的事情。

但是,请注意,如果由于某种原因,程序包包含与程序包同名的模块文件(至少在我的Python 3.7上),则此绝对导入(from package.module import something)将失败。所以,例如,如果你有(使用OP的例子)它会失败:

proj/
    __init__.py (empty)
    proj.py (same name as package)
    moduleA.py
    moduleB.py

在这种情况下你会得到:

ModuleNotFoundError: No module named 'proj.moduleB'; 'proj' is not a package

或者,您可以删除.中的from .moduleB import,正如建议的herehere,这似乎有效,虽然我的PyCharm(2018.2.4)将此标记为“未解析的参考”并且无法自动完成。


0
投票

也许你可以在导入模块之前执行此操作:

moduleA.py3

import os
import re
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from moduleB import ModuleB
ModuleB.hello()

将当前目录添加到环境目录

© www.soinside.com 2019 - 2024. All rights reserved.