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 路径中,并且它将您的子包(即 utils
、engines
等)视为单独的包,这就是为什么它给你一个错误,你在做相对导入时试图从你的包外部导入,而绝对导入不起作用,因为它找不到顶级项目目录,因为它不在任何 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
我想为我的项目采用这种结构:
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 路径中,并且它将您的子包(即 utils
、engines
等)视为单独的包,这就是为什么它给你一个错误,你在做相对导入时试图从你的包外部导入,而绝对导入不起作用,因为它找不到顶级项目目录,因为它不在任何 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