Python中的相对导入

30 投票
1 回答
20781 浏览
提问于 2025-04-16 07:02

大家好,我在使用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 相同的目录下,它就能正常工作了。这看起来有点反常。

撰写回答