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