Python相对导入仅适用于Django

时间:2015-06-16 23:47:19

标签: python import

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

app/包含__init__.pydir1dir2

dir1/包含__init__.pyutils.py

dir2/包含__init__.pymain.py

然后在main.pydir2内{我} from .dir1 import utils甚至from ..dir1 import utils说我收到如下错误:ValueError: Attempted relative import of non-package

我不明白,因为所有目录中都有__init__.py。为什么它总是在django项目中正常工作,但是当我从头开始创建自己的python项目时却没有?

我应该做些什么来导入这样的东西?显然绝对进口不是首选,但我不能让亲戚去工作。我发现的SO和其他网站上的所有答案似乎都没有提供解决方案,或者至少有一个对我有用的解决方案。有人可以请告诉我这样做的正确方法是什么?从目录中导入python文件,该目录是包含我调用import的文件的目录的兄弟。

非常感谢帮助。也许有一次,我们可以得到一个很好的简短答案,实际上是重点。

所有我真正需要的是有人向我展示我应该使用什么来进行此导入,并且其次解释为什么我不会在django中收到此错误但是在此处获取此错误。

我只是想让导入工作,每次我在Django之外开始自己的python应用程序(因为它不是基于网络的)我有这个问题,我找到的每个答案都没有帮助。

编辑:

我遇到的问题是从子目录或同一目录中的文件以外的任何内容导入文件。我遇到问题的地方是我需要的文件位于兄弟或父目录中。我需要帮助使导入工作。

1 个答案:

答案 0 :(得分:1)

你不能简单地从dir2执行main.py;您需要一个存在于整个应用程序包之外的各种脚本,然后如果您导入app.dir2.main,您还将通过相对导入获取app.dir1.utils。

创建一个执行from app.dir2 import main的脚本,然后在应用包之外运行该脚本。并使用from ..dir1 import utils中的main.py结构,带有2个前导点。

我无法解释为什么会这样,但我认为基本上在目录中执行的任何脚本/模块都不会查找目录链以查看它是否属于某个目录链模块。也就是说,main.py模块不会查看app目录并认为"嘿,我是模块的一部分,我也可以(相对)导入dir1。