我正在努力在我的一个项目中建立一个工作结构。问题是,我有一个像这样的结构的主包和子包(我遗漏了所有不必要的文件):
code.py
mypackage/__init__.py
mypackage/work.py
mypackage/utils.py
utils.py 有一些实用程序代码,通常仅在 mypackage 包中使用。
我通常在每个模块文件中都有一些测试代码,它们调用当前模块的一些方法并打印一些内容以快速检查一切是否正常工作。这段代码被放置在if __name__ == "__main__"
块位于文件末尾。所以我直接通过包含 utils.pyimport utils
。例如 mypackage/work.py 看起来像:
import utils
def someMethod():
pass
if __name__ == "__main__":
print(someMethod())
但是现在当我在父包(例如 code.py)中使用这个模块时,我像这样导入它
import mypackage.work
我收到以下错误:
ImportError: No module named 'utils'
经过一番研究后我发现,这可以通过添加来解决mypackage/
文件夹到 PYTHONPATH 环境变量,但这对我来说感觉很奇怪。难道就没有其他方法可以解决这个问题吗?我听说过相对进口,但这在关于模块的 python 文档 https://docs.python.org/3.5/tutorial/modules.html
请注意,相对导入基于当前模块的名称。由于主模块的名称始终是“main",用作 Python 应用程序主模块的模块必须始终使用绝对导入。
有什么建议我可以如何拥有if __name__ == "__main__"
子模块中的部分,并且还可以使用父包中的此文件而不会弄乱导入?
EDIT:如果我使用相对导入work.py
正如 import utils 的答案中所建议的:
from . import utils
我收到以下错误:
SystemError: Parent module '' not loaded, cannot perform relative import