Python导入结构

Python导入结构,python,structure,packages,Python,Structure,Packages,我希望我的项目具有以下结构: 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 r

我希望我的项目具有以下结构:

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
导入,UTIL也需要从
project.core.base
导入,并且
project.py
(运行的主文件)需要能够从
引擎导入

绝对导入不起作用:

# 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
。顶部的
项目
目录很可能位于python路径中,它将您的子包(即
utils
引擎
等)视为单独的包,这就是为什么在执行相对导入时,它会给您一个错误,即您试图从包外部导入,绝对导入不起作用,因为它找不到顶级项目目录,因为它不在任何python路径下

顶部项目目录是需要添加到python路径中的目录


尝试使用以下导入:

engine1.py:

from core import base
优化_data.py:

from core import base
project.py

from engines import engine1
如果使用pycharm,请将项目目录标记为源根目录,然后尝试运行project.py。如果不使用pycharm,可以通过转到项目目录并运行以下命令来运行project.py:

python project.py

兄弟包应该能够相互导入。所以引擎可以直接导入核心。我是否应该在脚本本身中执行
sys.path.append()
。您的软件包是要分发和安装的吗?如果是这样,您应该考虑为您的包创建一个
setup.py
脚本并安装它,确保它在pythonpath中。我只是想从命令行运行
project/project.py
。但是如果我分发它,我一定要创建一个
setup.py
(我必须用谷歌搜索,我不知道怎么做)。如果您运行的是
project.py
目录,请意识到您无法从那里进行相对导入。此外,当前,每当您运行python文件时,它都会自动将其所在的目录添加到python路径中。@BobDylan有关使用脚本运行项目以及将其放置在何处的更好解释,请参阅此答案--
python project.py