Python中的相对导入

ape*_*dge 28 python python-packaging

嘿所有 - 我用Python中的相对导入拉出我的头发.我已经阅读了30次文档和SO和其他论坛上的大量帖子 - 似乎仍然没有用.

我的目录结构目前看起来像这样

src/
    __init__.py
    main.py
    components/
        __init__.py
        expander.py
        language_id.py
    utilities/
        __init__.py
        functions.py
Run Code Online (Sandbox Code Playgroud)

我希望expandder.py和language_id.py可以访问函数模块.我运行python main.py,它可以从components.expander import*和components.language_id import*访问模块.

但是,在expandder和language_id中的代码访问函数模块:

from ..utilities.functions import *
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ValueError: Attempted relative import beyond toplevel package
Run Code Online (Sandbox Code Playgroud)

我已经过了很多次,它似乎遵循文档.任何人都对这里出了什么问题有任何想法?

ape*_*dge 21

没关系,我解决了它:

src/
    main.py
    mod/
        __init__.py
        components/
            __init__.py
            expander.py
            language_id.py
        utilities/
            __init__.py
            functions.py
Run Code Online (Sandbox Code Playgroud)

main.py然后将子包称为:

from mod.components.expander import *
from mod.utilities.functions import *
Run Code Online (Sandbox Code Playgroud)

expandder.py和language_id.py可以访问functions.py:

from ..utilities.functions import *
Run Code Online (Sandbox Code Playgroud)

但有趣的是,我在componentsder.py使用的components目录中有一个文本文件.但是,在运行时,即使文件位于同一目录中,也无法找到该文件.我将文本文件移动到与main.py相同的目录,并且它工作正常.似乎违反直觉.

  • 所有新模块导入的东西都是破碎的,不直观的. (17认同)
  • 打开文本文件的方法是从启动程序的工作目录开始,而导入则是相对于脚本的位置.您可以在模块中使用\ _\_ _ file\_ _ _来查找其路径,因此引用同一目录中的内容,尽管它不是很优雅.如果文本文件是程序的静态数据,则可能更容易将其转换为Python模块并导入它. (3认同)