关于python 3.x:ModuleNotFoundError:没有名为’__main __。xxxx’的模块;

ModuleNotFoundError: No module named '__main__.xxxx'; '__main__' is not a package

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

1
2
3
4
proj
    __init__.py3 (empty)
    moduleA.py3
    moduleB.py3

模块A.PY3

1
2
from .moduleB import ModuleB
ModuleB.hello()

模块B.PY3

1
2
3
class ModuleB:
    def hello():
        print("hello world")

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


.moduleB是相对进口。只有在首先导入或加载父模块时,relative才起作用。这意味着您需要在当前运行时环境中的某个地方导入proj。当您使用命令python3 moduleA.py3时,将无法导入父模块。你可以:

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

祝你在Python这片神奇的土地上好运。


除了md sabuj sarker的答案之外,python模块文档中还有一个很好的例子。

这就是文档对包内引用所说的:

Note that relative imports are based on the name of the current module. Since the name of the main module is always "__main__", modules intended for use as the main module of a Python application must always use absolute imports.

如果运行python3 moduleA.py3,则使用moduleA作为主模块,因此使用绝对导入看起来是正确的做法。

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

1
2
3
4
5
proj/
    __init__.py (empty)
    proj.py (same name as package)
    moduleA.py
    moduleB.py

在这种情况下,您将得到:

埃多克斯1〔9〕

或者,您可以删除from .moduleB import中的.,正如这里和这里建议的那样,虽然我的Pycharm(2018.2.4)将其标记为"未解决的引用",但无法自动完成。


也许在导入模块之前可以这样做:

模块A.PY3

1
2
3
4
5
6
import os
import re
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from moduleB import ModuleB
ModuleB.hello()

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