Python中的相对导入
大家好,我在使用Python的相对导入时快要抓狂了。我已经看了30遍文档,还有很多在StackOverflow和其他论坛上的帖子,但还是搞不定。
我的文件夹结构现在是这样的:
src/
__init__.py
main.py
components/
__init__.py
expander.py
language_id.py
utilities/
__init__.py
functions.py
我希望expander.py和language_id.py能够访问functions模块。我运行python main.py,使用from components.expander import *和components.language_id import *来访问模块,这样没问题。
但是在expander和language_id里面,想要访问functions模块的代码是这样的:
from ..utilities.functions import *
结果我收到了这个错误:
ValueError: Attempted relative import beyond toplevel package
我已经检查了很多遍,感觉是按照文档来的。有没有人知道这里出了什么问题?
1 个回答
22
没关系,我解决了这个问题:
src/
main.py
mod/
__init__.py
components/
__init__.py
expander.py
language_id.py
utilities/
__init__.py
functions.py
main.py 然后这样引用子包:
from mod.components.expander import *
from mod.utilities.functions import *
expander.py 和 language_id.py 可以通过以下方式访问 functions.py:
from ..utilities.functions import *
有趣的是,我在 components 目录里有一个文本文件,expander.py 用到了这个文件。但是在运行时,它找不到这个文件,尽管它就在同一个目录里。我把这个文本文件移动到与 main.py 相同的目录下,它就能正常工作了。这看起来有点反常。