'Attempted relative import in non-package' although packages with __init__.py in one directory
我有一个名为extended.py的模块,其中包含以下行:
1
| from .basic import BasicModule |
文件basic.py与__init__.py位于同一目录中。但是,当我尝试运行它时:
我得到错误:
1
| ValueError: Attempted relative import in non-package |
同时添加行:
1
| from __future__ import absolute_import |
不能解决问题。也许我太累了,看不到明显的东西——但我看不到问题所在。
- 尝试在非包中进行相对导入的可能副本,即使使用uu init_uuy.py
- 埃多克斯1〔0〕怎么样?
- 在python中如何进行相对导入的可能副本?
相对导入仅适用于包,但当您在extended.py中导入时,您将运行一个顶级模块。
当前目录可能包含一个__init__.py文件,但这还不能使exended.py成为包的一部分。
对于要被视为包的内容,您需要导入目录名。以下内容将起作用:
1 2 3 4 5 6
| main.py
packagename\
__init__.py
basic.py
extended.py |
然后在main.py中:
1
| import packagename.extended |
只有这样,extended才是一揽子计划的一部分,并做相关的进口工作。
现在,相对进口与packagename父母有关系。
- 但在这种情况下,我如何运行unittests?我必须为这些导入的情况指定一个python参数(-m)吗?
- 对于包中未定义的任何内容,不要使用相对导入,而是使用绝对导入。UnitTest脚本不是包的一部分,它是外部脚本。
- 我一直认为应该把单元测试放在同一个模块中?在与Python的联合测试中,是否有良好的实践或PEP?
- 当然,将测试与包捆绑在一起,但可能不会直接以脚本的形式运行测试。使用另一个工具来发现测试,例如nose。
- 好吧,这很公平。谢谢你的帮助。
- 如果您使用设置工具,也可以使用它;有关详细信息,请参阅test-构建一个包并运行一个测试套件。然后从包中导入测试,相关导入将正常工作。
- 我很困惑——操作从未建议导入extended.py——他想在执行extended.py时导入basic.py。另外,什么是main.py?手术室从没提到过那个文件
- @保罗:我已经澄清了第一句话,这确实令人困惑。
- @保罗:main.py是我的答案介绍的一个新文件,在包外。
- 知道了。谢谢!我也有同样的问题,现在已经解决了。