Python 相对导入仅适用于 Django


嗨,我经常使用

Django,并且经常按照模型文件夹中的 XXX from .models import XXX或同一目录中名为 views.py 的文件的from . import views的行使用相对导入,它在那里工作正常。 但是当我使用目录结构创建自己的 Python 应用程序时,例如:

包含__init__.pydir1dir2 app/

dir1/包含__init__.pyutils.py

dir2/包含__init__.pymain.py

然后在main.py里面说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的脚本,然后在应用包外部运行该脚本。并在结构中使用from ..dir1 import utils main.py ,带有 2 个前导点。


我不能给你确切的原因,但我认为基本上在目录中执行的任何脚本/模块都不会查找目录链以查看它是否是模块的一部分。也就是说,main.py 模块不会查看应用程序目录并认为"嘿,我是模块的一部分,我也可以(相对)导入 dir1。

最新更新