我创建的一些小项目具有以下目录结构:
my_project/
├─ docs/
├─ code/
│ ├─ __init__.py
│ ├─ main.py
│ └─ tools.py
├─ README
└─ .gitignore
并在main.py
我使用以下绝对导入语句tool()
从tools.py
模块导入函数:
from tools import tool
当我查看一些众所周知的(可能也写得很好)包的源代码时,我发现了一个类似的结构,但绝对导入语句的风格不同:
( Django , /django/core/paginator.py)
from django.utils.functional import cached_property
from django.utils.inspect import method_has_no_args
为什么django
导入语句中包含父目录?它是如何导入模块的首选方式?当我将逻辑应用于我的项目并tool()
像这样更改函数的导入时:
from code.tests import test
然后在终端中运行以下命令:
python3 main.py
它ModuleNotFoundError
当然提出了。
我想了解为什么这些包使用这种样式的导入语句(这与我的不同,不适用于我自己的项目)。我仍在学习 Python,因此也非常感谢一些要阅读的链接。
它不是像您假设的那样引用本地目录,而是引用其安装路径中的实际模块本身。
安装模块后,Python 解释器可以访问django
它,因为它基本上是在引用模块的安装位置。解释基本上是在尝试做:
django
我当前的工作目录中有路径吗?django
我可以在我的环境路径中引用的路径?ModuleNotFoundError
.按照此逻辑,包使用绝对导入,因为paginator.py
位于django/core
路径中,因此无法访问django/utils
路径,除非它直接将自身引用为来自site-packages
或使用相对导入(from ..utils.functional import cached_property
等)的已安装模块。此链接有更多详细信息。
要将您的情况下的苹果与苹果进行比较 - 尝试test.py
在my_project/utils
. 您会注意到如果main.py
没有绝对或相对导入,您将无法访问该模块,因为 Python 解释器只知道您当前的工作目录(core
,假设您main.py
直接运行,或者您实际执行解释器的任何位置)和任何其他模块目录可通过您的环境路径访问。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句