尽管一个目录中有__init__.py,仍然出现'在非包中尝试相对导入
我有一个模块叫做 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
也没有解决问题。也许我太累了,看不出明显的错误 - 但我就是看不出问题出在哪里。
1 个回答
59
相对导入只适用于包,但当你在 extended.py
中进行导入时,其实是在运行一个顶层模块。
当前目录可能有一个 __init__.py
文件,但这并不意味着 extended.py
已经成为一个包的一部分。
要让某个东西被视为包,你需要导入目录名称。这样做才有效:
main.py
packagename\
__init__.py
basic.py
extended.py
然后在 main.py
中放入:
import packagename.extended
只有这样,extended
才算是包的一部分,这样相对导入才能正常工作。
现在,相对导入有了一个可以相对的对象,也就是 packagename
的父级。