Python 相对导入只适用于 Django
Python Relative Imports Only Work With Django
您好,我经常使用 Django,并且我一直在使用相对导入,例如 from .models import XXX
用于模型文件夹中的 XXX 或 from . import views
用于同一目录中名为 views.py 的文件,并且它在那里工作正常。但是当我创建自己的 Python 应用程序时,其目录结构如下:
app/
包含 __init__.py
、dir1
和 dir2
dir1/
包含__init__.py
、utils.py
dir2/
包含__init__.py
、main.py
然后说 main.py
in dir2
我做 from .dir1 import utils
甚至 from ..dir1 import utils
我得到一个错误,如:ValueError: Attempted relative import of non-package
我不明白,因为所有目录中都有一个 __init__.py
。为什么它在 Django 项目中总是工作正常,但当我从头开始我自己的 python 项目时却不行?
我应该怎么做才能导入这样的东西?显然绝对进口不是首选,但我不能让亲戚工作。我在 SO 和其他网站上找到的所有答案似乎都没有提供解决方案,或者至少没有提供对我有用的解决方案。有人可以告诉我像这样进行导入的正确方法是什么吗?从一个目录导入一个 python 文件,该目录是包含我从中调用导入的文件的目录的兄弟目录。
非常感谢您的帮助。也许这一次我们可以得到一个切中要害的简短答案。
我真正需要的是有人告诉我我应该用什么来做这个导入,然后解释为什么我在 django 中没有得到这个错误但是在这里得到它。
我只是想让导入工作,每次我在 Django 之外启动我自己的 python 应用程序(因为它不是基于 Web 的)时,我遇到了这个问题,我找到的每个答案都没有帮助。
编辑:
我遇到的问题是从除子目录或同一目录中的文件之外的任何文件导入文件。我遇到问题的地方是当我需要的文件位于兄弟目录或父目录中时。我需要帮助才能完成导入工作。
您不能简单地从 dir2 执行 main.py;您将需要一个位于整个应用程序包之外的脚本,然后如果您导入 app.dir2.main,您将通过相对导入获得 app.dir1.utils。
创建一个执行 from app.dir2 import main
的脚本,然后 运行 在应用程序包之外执行此操作。并在 main.py
的结构中使用 from ..dir1 import utils
,前导点为 2。
我不能给你确切的原因,但我认为基本上任何在目录内执行的 script/module 都不会查找目录链以查看它是否是模块的一部分。也就是说,main.py 模块不会查看 app 目录并认为“嘿,我是模块的一部分,我也可以(相对地)导入 dir1。
您好,我经常使用 Django,并且我一直在使用相对导入,例如 from .models import XXX
用于模型文件夹中的 XXX 或 from . import views
用于同一目录中名为 views.py 的文件,并且它在那里工作正常。但是当我创建自己的 Python 应用程序时,其目录结构如下:
app/
包含 __init__.py
、dir1
和 dir2
dir1/
包含__init__.py
、utils.py
dir2/
包含__init__.py
、main.py
然后说 main.py
in dir2
我做 from .dir1 import utils
甚至 from ..dir1 import utils
我得到一个错误,如:ValueError: Attempted relative import of non-package
我不明白,因为所有目录中都有一个 __init__.py
。为什么它在 Django 项目中总是工作正常,但当我从头开始我自己的 python 项目时却不行?
我应该怎么做才能导入这样的东西?显然绝对进口不是首选,但我不能让亲戚工作。我在 SO 和其他网站上找到的所有答案似乎都没有提供解决方案,或者至少没有提供对我有用的解决方案。有人可以告诉我像这样进行导入的正确方法是什么吗?从一个目录导入一个 python 文件,该目录是包含我从中调用导入的文件的目录的兄弟目录。
非常感谢您的帮助。也许这一次我们可以得到一个切中要害的简短答案。
我真正需要的是有人告诉我我应该用什么来做这个导入,然后解释为什么我在 django 中没有得到这个错误但是在这里得到它。
我只是想让导入工作,每次我在 Django 之外启动我自己的 python 应用程序(因为它不是基于 Web 的)时,我遇到了这个问题,我找到的每个答案都没有帮助。
编辑:
我遇到的问题是从除子目录或同一目录中的文件之外的任何文件导入文件。我遇到问题的地方是当我需要的文件位于兄弟目录或父目录中时。我需要帮助才能完成导入工作。
您不能简单地从 dir2 执行 main.py;您将需要一个位于整个应用程序包之外的脚本,然后如果您导入 app.dir2.main,您将通过相对导入获得 app.dir1.utils。
创建一个执行 from app.dir2 import main
的脚本,然后 运行 在应用程序包之外执行此操作。并在 main.py
的结构中使用 from ..dir1 import utils
,前导点为 2。
我不能给你确切的原因,但我认为基本上任何在目录内执行的 script/module 都不会查找目录链以查看它是否是模块的一部分。也就是说,main.py 模块不会查看 app 目录并认为“嘿,我是模块的一部分,我也可以(相对地)导入 dir1。