【问题标题】:How to resolve "ValueError: attempted relative import beyond top-level package"如何解决“ValueError:尝试相对导入超出顶级包”
【发布时间】:2018-12-05 09:32:54
【问题描述】:

我的项目有以下问题,请帮助我!这是我的包的结构:

/pkg

/pkg/__init__.py
/pkg/sub1/__init__.py
/pkg/sub2/__init__.py

/pkg/sub1/foo1.py
/pkg/sub2/foo2.py

这里是 foo1.py 的实现:

from ..sub2 import foo2

def f():
    print("Hello!")

当我运行 foo1 时,我收到错误:ValueError:尝试相对导入超出顶级包

我可以通过以下调整来解决它:

import sys
import os
sys.path.append(os.path.abspath(os.path.pardir))

from sub2 import foo2
def f():
    print("Hello!")

但我想知道是否有一种方法可以在不导入 sys 并在其中附加父目录的情况下做到这一点。

我听说如果我有 .py 文件“/pkg/start.py”,例如它调用了我的 foo1 模块,那么两个点就可以了。但是,有没有办法直接从 foo1 调用 foo2 呢?

【问题讨论】:

    标签: python python-3.x python-3.6 sys python-packaging


    【解决方案1】:

    在我看来,如果不将 pkg 添加到我的 PATH 中,就不可能从 sub1 中的 sub2 导入模块。原因如下:

    相对导入使用模块的 name 属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何包信息(例如,它被设置为'ma​​in'),那么相对导入将被解析为好像该模块是顶级模块,而不管模块实际位于何处在文件系统上。

    Here is official python web site, where it is explained

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2021-10-03
      • 2020-11-03
      • 2017-02-22
      • 2019-12-24
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多