【问题标题】:'Attempted relative import in non-package' although packages with __init__.py in one directory'尝试在非包中进行相对导入'尽管包在一个目录中带有 __init__.py
【发布时间】:2013-02-02 17:10:58
【问题描述】:

我有一个名为 extended.py 的模块,其中包含以下行:

from .basic import BasicModule

文件basic.py__init__.py 位于同一目录中。但是,当我尝试将其运行为:

python extended.py

我得到错误:

ValueError: Attempted relative import in non-package

同时添加一行:

from __future__ import absolute_import

不能解决问题。 也许我太累了,看不到明显的东西 - 但我看不到这里的问题。

【问题讨论】:

标签: python python-2.7 python-import


【解决方案1】:

相对导入仅适用于包,但当您在 ​​extended.py 中导入时,您正在运行 顶级模块

当前目录可能包含一个__init__.py 文件,但这还没有使exended.py 成为包的一部分。

对于被视为包的东西,您需要导入 目录名称。以下将起作用:

main.py

packagename\
    __init__.py
    basic.py
    extended.py

然后在main.py 中输入:

import packagename.extended

并且只有 然后extended 包的一部分并执行相关导入工作。

相对导入现在与 to 是相对的,packagename 父级。

【讨论】:

  • 但在这种情况下我怎么能运行unittests?我是否必须为这些导入案例指定 python 参数 (-m)?
  • 对于包中没有定义的任何东西,不要使用相对导入,而是使用绝对导入。 unittest 脚本不是包的一部分,它是一个外部脚本。
  • 我一直认为应该将单元测试放在同一个模块中?是否有关于使用 python 的 unitest 的良好实践或 PEP?
  • 当然,将测试与包捆绑在一起,但可能不会直接将测试作为脚本运行。请改用其他工具来发现测试,例如 nose
  • 好的,这很公平。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2022-06-13
  • 2012-07-17
  • 2014-02-28
  • 2017-05-17
  • 2019-05-25
  • 2014-01-02
相关资源
最近更新 更多