Python 导入结构

Python imports structure

我想为我的项目采用这种结构:

requirements.txt
README.md
.gitignore
project/
    __init__.py
    project.py
    core/
        __init__.py
        base.py
    engines/
        __init__.py
        engine1.py
        engine2.py
    utils/
        __init__.py
        refine_data.py
        whatever.py

申请来自 project/project.py运行。但是,在使用相对或绝对导入时,我经常遇到导入错误。

两个引擎都需要从 project.core.base 导入,utils 也需要从 project.core.base 导入,并且 project.py(主文件 运行)需要能够从 engines.

导入

绝对导入不起作用:

# engines/engine1.py
from project.core.base import MyBaseClass

给出错误:

ImportError: No module named project.core.base

但如果我改为尝试相对导入

# engines/engine1.py
from ..core.base import MyBaseClass

我得到:

ValueError: Attempted relative import beyond toplevel package

我在 Github 上看到过类似结构的其他项目,但这似乎会导致各种问题。我如何让它工作?

看看你的sys.path。顶层 project 目录很可能在 python 路径中,并且它将您的子包(即 utilsengines 等)视为单独的包,这就是为什么它给你一个错误,你在做相对导入时试图从你的包外部导入,而绝对导入不起作用,因为它找不到顶级项目目录,因为它不在任何 python 路径。

顶级项目目录上方目录是需要添加到python路径的目录。

例如

/path/is/here/project/core/...

# Add this to the PYTHONPATH
/path/is/here  

尝试使用这些导入:

engine1.py:

from core import base

refine_data.py:

from core import base

project.py

from engines import engine1

如果您使用 pycharm 将 项目 目录标记为源根目录,然后尝试 运行 project.py。如果你不使用 pycharm,你可以 运行 project.py 通过进入 project 目录和 运行ning 命令:

python project.py