关于python:更多相对导入奇数:..符号

More relative import oddness: .. notation

我注意到,我问了5个有关相对进口的问题,每个问题都有解决方案,但情况不同。我越是阅读文档,越是尝试不同的案例,我就越是困惑,并质疑我是否真正正确地阅读了单词。

来自PEP 328:

1
2
3
4
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.

我的理解是"当前包"是这里的关键字。什么是"当前套餐"?它是执行开始的模块的包吗?(即:文件名为"主文件")。

总之,这里有一个我使用..符号的简单情况。

1
2
3
4
5
6
7
8
main/
  lib/
    __init__.py
    myLib.py
  plugin/
    __init__.py
    needLib.py
  run.py

run.py导入needlib:EDOCX1[1]

needlib导入mylib:from ..lib import myLib

我脑子里在想什么:(needlib)打开一个包,进入lib,抓取my lib

我是这样执行的:python run.py

结果:尝试在顶级包之外进行相对导入

但当我把import调用改为from .lib import myLib时,它起作用了。

我不明白为什么后者起作用,而..表示法不起作用。当然,main不是一个包,那么我在那里也加入一个init.py,结果

1
2
3
4
5
6
7
8
9
main/
  lib/
    __init__.py
    myLib.py
  other/
    __init__.py
    needLib.py
  __init__.py
  run.py

但这并没有什么不同;仍在尝试导入顶级包之外的内容

检查这个问题:python:强制相对导入从脚本文件搜索

..符号实际上起作用了!现在我想起来了,我不明白为什么它会起作用。该方案中的执行从发生相对导入的位置开始执行2个级别,而该方案中的执行从发生相对导入的位置开始执行1个级别。除了我开始执行的地方,情况是相同的。

这两个都是我说的"上一个目录,进入lib包,并获取您想要的模块"。

这种情况与参考情况之间的关键区别是什么?为什么..在那里工作,而不是在这里工作?我用2.6跟这个有关系吗?或者我是怎么执行的?python run.py


正如您发现的,from ..lib import myLib不起作用,因为main不是一个包。相对导入只在模块自己的包中工作。在您的示例中,libother是两个不同的包。

main中放入__init__.py只在将run移出新创建的main包时有效,这样当前目录(sys.path的一部分)就不在包中。