首页 > 解决方案 > 导入目录时出现奇怪的属性错误

问题描述

我有一个目录树如下:

main.py
dir1
  sub1.py
  sub2.py

main.py

import dir1.sub1

dir1/sub1.py

def f1() -> None:
    print("f1")


import dir1.sub2

dir1.sub2.f2()

dir1/sub2.py

import dir1.sub1


def f2() -> None:
    dir1.sub1.f1()
    print("f2")

当我运行时main.py,我收到以下错误消息:

Traceback (most recent call last):
  File "...\main.py", line 1, in <module>
    import dir1.sub1
  File "...\dir1\sub1.py", line 7, in <module>
    dir1.sub2.f2()
  File "...\dir1\sub2.py", line 5, in f2
    dir1.sub1.f1()
AttributeError: module 'dir1' has no attribute 'sub1'. Did you mean: 'sub2'?

...文件路径开头的 是我的工作目录。)

如果我main.py改为

import dir1.sub2

我收到一条略有不同的错误消息:

Traceback (most recent call last):
  File "...\main.py", line 1, in <module>
    import dir1.sub2
  File "...\dir1\sub2.py", line 1, in <module>
    import dir1.sub1
  File "...\dir1\sub1.py", line 7, in <module>
    dir1.sub2.f2()
AttributeError: module 'dir1' has no attribute 'sub2'

如果我移动sub1.pysub2.py相同的目录main.py并根据需要重定向导入,我会得到预期的输出

f1
f2

为什么会发生这种情况,我怎样才能让它不发生?

标签: pythonpython-import

解决方案


您需要使用绝对导入,因为 Python 3 只支持它。在 Python 2 中,您的方法将起作用。因此,例如,如果您将import dir1.sub2其更改为from dir1 import sub2. 见这里

注意:我已经使用您的设置对其进行了测试,并且可以正常工作。


推荐阅读