目前正在尝试使用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
给出错误。这里有什么需要改变的?
.moduleB
是相对进口的。相对仅在首先导入或加载父模块时有效。这意味着您需要在当前运行时环境中的某处导入proj
。当您使用命令python3 moduleA.py3
时,它没有机会导入父模块。您可以:
from proj.moduleB import moduleB
或run.py
,来调用from proj import moduleA
祝你旅途愉快,前往Python的绝佳之地。
除了md-sabuj-sarker的答案之外,Python modules documentation还有一个非常好的例子。
这就是文档对intra-package-references的看法:
请注意,相对导入基于当前模块的名称。由于主模块的名称始终是
"__main__"
,因此用作Python应用程序主模块的模块必须始终使用绝对导入。
如果你运行python3 moduleA.py3
,moduleA
被用作主模块,所以使用绝对导入看起来是正确的事情。
但是,请注意,如果由于某种原因,程序包包含与程序包同名的模块文件(至少在我的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
,正如建议的here和here,这似乎有效,虽然我的PyCharm(2018.2.4)将此标记为“未解析的参考”并且无法自动完成。
也许你可以在导入模块之前执行此操作:
moduleA.py3
import os
import re
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from moduleB import ModuleB
ModuleB.hello()
将当前目录添加到环境目录