首页 文章

更相对导入奇怪:..符号

提问于
浏览
4

我注意到我已经提出了大约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, grab 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包,然后 grab 你想要的模块” .

这种情况与参考情况之间的主要区别是什么?为什么 .. 在那里工作,但不是在这里?我使用2.6与此有什么关系吗?或者也许我是如何执行它的? python run.py

1 回答

  • 3

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

    只有在新创建的 main 包之外移动 run ,才能将 __init__.py 放在 main 中,以便当前目录( sys.path 的一部分)在包中是 not .

相关问题