尽管一个目录中有__init__.py,仍然出现'在非包中尝试相对导入

37 投票
1 回答
66191 浏览
提问于 2025-04-17 14:32

我有一个模块叫做 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 的父级。

撰写回答