【问题标题】:Attempted relative import beyond top level package using python -m尝试使用 python -m 相对导入超出顶级包
【发布时间】:2017-12-17 07:32:59
【问题描述】:

我几乎查看了有关相对导入的每个链接,尤其是那些有关顶级包的链接,但我仍然很难让我的相对导入代码正常工作。作为参考,我使用的是 Python 3.6。

我有一个要运行的测试目录,隔离在他们自己的目录中,tests。我想将所有模块包导入到一个名为 InputTests.py 的文件中。这里是我的项目目录的格式

在 InputTests.py 中,我尝试以这种方式导入模块:

from .. import modules

我得到错误:

File "/Users/wfehrnstrom/Desktop/meeting_minutes/tests/InputTests.py", 
line 2, in <module>
from .. import modules
ValueError: attempted relative import beyond top-level package<code>

但是,我使用的是命令:python -m tests.InputTests,据说它告诉解释器从我的顶级目录运行所有内容。所以我想我的问题是,考虑到我是从上面的包中运行它,为什么我的相对导入语句不起作用。这个堆栈溢出帖子似乎详细说明了我需要什么,但他们的解决方案,使用 -m 运行对我不起作用:How to do relative imports in Python?

另外,这个堆栈溢出帖子似乎与此有矛盾:Relative importing modules from parent folder subfolder

后一篇文章似乎暗示了 .. 和 . 的上下文含义。不要根据您执行 Python 命令的位置进行更改,但是前者表示确实如此。这让我非常困惑。任何人都可以澄清相对进口并解决这种差异吗?谢谢。

【问题讨论】:

    标签: python python-3.x python-import python-module relative-import


    【解决方案1】:

    我只能尝试回答您关于 Python 2.7 的问题,但我希望这对您有所帮助。

    PEP 328 在“如何在 Python 中进行相对导入?”的答案中被引用。您链接的部分已过时,因为它建议基于模块的__name__ 进行导入,该模块的主脚本将是__main__,因此即使使用-m,也完全阻止在该模块中使用相对导入。

    PEP 366 通过引入__package__ 属性解决了这个问题。

    当您使用python -m tests.InputTests 时,InputTests.py 中的__package__ 的值将是tests。这不允许从父包导入,因为tests 是当前的顶级包。

    在“meeting_minutes”目录中运行python -m modules.tests.InputTests 应该可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 2020-11-03
      • 2017-02-22
      • 1970-01-01
      • 2016-05-12
      相关资源
      最近更新 更多