我注意到我已经提出了大约5个问题,询问相关进口,每个都有工作解决方案,但情况不同。我阅读的文档越多,我尝试不同的案例越多,我就越感到困惑,并质疑我是否真的正确地阅读了这些文字。
从第328页开始:
A single leading dot indicates a relative import, starting with the current package. Two or more leading dots give a relative import to the parent(s) of the current package, one level per dot after the first.
我的理解是“当前包”是这里的关键字。什么是“当前套餐”?它是执行开始的模块的包吗? (即:具有__ name __ ==“__ main __”的文件)。
无论如何,这是我使用..
表示法的简单情况。
main/ lib/ __init__.py myLib.py plugin/ __init__.py needLib.py run.py
run.py导入needLib:from plugin import needLib
needLib导入myLib:from ..lib import myLib
我的脑子里有什么:( needLib)上传一个包,进入lib,抓住myLib
以下是我的执行方式:python run.py
结果:尝试相对导入超出顶级包
但当我将导入调用更改为from .lib import myLib
时,它可以正常工作。
我不明白为什么后者有效而..
符号没有。当然,main
不是一个包,所以我只是在那里投入一个init.py
,导致
main/ lib/ __init__.py myLib.py other/ __init__.py needLib.py __init__.py run.py
但这并没有什么不同;仍在尝试导入超出顶级包
查看此问题:python: forcing relative imports to search from script file
..
符号实际上有效!现在我想起来了,我不明白它为什么会起作用。该场景中的执行从相对导入发生的位置开始上升2级,而此场景中的执行从相对导入发生的位置开始上升1级。除了我开始执行的地方,情况是相同的。
我们都说“上一个目录,进入lib包,然后抓住你想要的模块”。
这种情况与参考情况有什么关键区别?为什么..
在那里工作,但不在这里?我使用2.6与此有什么关系吗?或者也许我是如何执行它的? python run.py
答案 0 :(得分:3)
正如您所知,from ..lib import myLib
不起作用,因为main
不是一个包。相对导入仅在模块自己的包中工作。在您的示例中,lib
和other
是两个不同的包。
只有__init__.py
在新创建的main
包之外移动,才能将run
放在main
中,以便当前目录(sys.path
的一部分})在包中不。