【问题标题】:More relative import oddness: .. notation更多相对的进口怪异:.. notation
【发布时间】:2011-08-26 15:43:21
【问题描述】:

我注意到我提出了大约 5 个关于相对导入的问题,每个问题都有可行的解决方案,但情况不同。我阅读文档越多,尝试不同案例的次数越多,我就越感到困惑和质疑我是否真的正确阅读了这些单词。

来自 pep 328:

单个前导点表示相对导入,
从当前包开始。两个或多个前导点
对当前包的父级进行相对导入,
在第一个之后每个点一个级别。

我的理解是“当前包”是这里的关键字。什么是“当前包”?它是执行开始的模块的包吗? (即:带有 __ 名称 __ == "__ main __" 的文件)。

无论如何,这是我使用.. 表示法的简单情况。

主要的/ 库/ __init__.py 我的库 插入/ __init__.py 需要Lib.py 运行.py

run.py 导入需要库:from plugin import needLib

needLib 导入 myLib:from ..lib import myLib

我脑子里在想什么:(needLib) 上一个包,进入 lib,抓取 myLib

这是我的执行方式:python run.py

结果:尝试相对导入超出顶级包

但是当我将导入调用更改为 from .lib import myLib 时,它可以工作。

我不明白为什么后者有效而 .. 表示法无效。当然,main 不是一个包,那我在那儿也扔一个<strong>init</strong>.py 怎么样,结果是

主要的/ 库/ __init__.py 我的库 其他/ __init__.py 需要Lib.py __init__.py 运行.py

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

看看这个问题:python: forcing relative imports to search from script file

.. 符号确实有效!现在我想起来了,我不明白它为什么会起作用。该场景中的执行从发生相对导入的位置向上 2 级开始,而在该场景中的执行从发生相对导入的位置向上 1 级开始。除了我开始执行的地方,情况是一样的。

我都是说“上一个目录,进入 lib 包,然后获取你想要的模块”。

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

【问题讨论】:

    标签: python import


    【解决方案1】:

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

    __init__.py 放入main 仅当您将run 移出新创建的main 包时才有效,因此当前目录(sys.path 的一部分)不是 在一个包内。

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 2013-01-23
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2011-08-28
      相关资源
      最近更新 更多