【问题标题】:I got an error Attempted relative import beyond top-level package我得到一个错误尝试相对导入超出顶级包
【发布时间】:2020-08-31 13:20:41
【问题描述】:

我正在编写一个 python 应用程序并尝试在一个结构中管理代码。

我的目录结构如下:-

package/
   A/
     __init__.py
     base.py
   B/
     __init__.py
     base.py
app.py
__init__.py

所以我在 A/init.py 中有一行写着

from .base import *

那里没问题,但是当我将同一行放入 B/init.py

from .base import *

我收到一个错误

E0402: Attempted relative import beyond top-level package.

这两者不应该是相同的吗?我到底做错了什么?

我使用的是 Python 3.6,我运行应用程序的方式是从终端使用

> python app.py

谢谢

更新: 抱歉,错误来自其他地方。

在 A/base.py 我有

class ClassA():
  ...

在 B/base.py 我有

from ..A import ClassA

class ClassB(ClassA):
  ...

错误来自 B/base.py 中的 import 语句

from ..A import ClassA

更新 #2 @JOHN_16 app.py 如下:-

from A import ClassA
from B import ClassB

if __name__ == "__main__":
  ...

还按照建议更新了目录以包含空的 init.py。

【问题讨论】:

  • 想想 Python 处理模块声明的顺序
  • app.py 的内容是什么?
  • @JOHN_16 参考更新#2 thx。任何帮助将不胜感激

标签: python python-3.x


【解决方案1】:

这是因为您有两个包:AB。包 B 无法通过相对导入访问包 A 的内容,因为它无法移出顶级包。在你的情况下,这两个包都是顶级的。

你需要重新组织你的项目,例如这样

.
├── TL
│   ├── A
│   │   ├── __init__.py
│   │   └── base.py
│   ├── B
│   │   ├── __init__.py
│   │   └── base.py
│   └── __init__.py
└── app.py

并更改内容 pf 你app.py 以使用包 TL:

from TL.A import ClassA
from TL.B import ClassB

if __name__ == "__main__":

【讨论】:

  • 我会将此标记为正确答案。我设法让它在你建议的这个结构中工作。谢谢!
【解决方案2】:

我的问题是在我的顶级目录中忘记了__init__.py。这允许我对该目录中的文件夹使用相对导入。

【讨论】:

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