我收到错误尝试相对导入超出顶级包

问题描述 投票:1回答:2

我正在编写一个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 python-3.x
2个回答
1
投票

这是因为你有两个软件包:A和B.软件包B无法通过相对导入访问软件包A的内容,因为它无法移动到top-lvevel软件包之外。在你的情况下,两个包都是顶级的。

您需要重新组织项目,例如那样

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

并在app.py中更改内容以使用包TL:

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

if __name__ == "__main__":

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.