导入目录时出现奇怪的属性错误

Wierd attribute error with importing into directories

我有一个目录树如下:

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

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

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

注意:我已经使用您的设置对其进行了测试并且它有效。