3 级链接 python 导入失败

3 level chained python import is failing

我有以下 3 个级别的文件夹结构:folder1 包含 folder1_1,后者又包含 folder1_1_1。现在我们在每个文件夹中都有一个 .py 文件(除了显然需要的 'init.py' 之外,抱歉,我不知道如何在前后放置这两行) .

folder1  
L __init__.py  
L file1.py  
L folder1_1  
  L __init__.py  
  L file1_1.py  
  L folder1_1_1  
    L __init__.py  
    L file1_1_1.py

文件内容 file1.py

from folder1_1.file1_1 import Test1_1 as lvl2
class Test1:
    randomnumber = 1
    sum = randomnumber  + lvl2.sum
    print (sum)

file1_1.py

from folder1_1_1.file1_1_1 import Test1_1_1 as lvl3
class Test1_1:
    somenumber = 1
    sum = somenumber + lvl3.someothernumber
    print (sum)

file1_1_1.py

class Test1_1_1:
    someothernumber = 1

所以每个文件都是从直接下层文件夹导入的。一步有效: 当我 运行 file1_1.py 来自 file1_1_1 的导入工作正常时,它会产生所需的结果 (2)

但是文件 1 中的“2 级”导入失败:

  File "c:\Users\DSCO\Documents\folder1\folder1_1\file1_1.py", line 1, in <module>
    from folder1_1_1.file1_1_1 import Test1_1_1 as lvl3
ModuleNotFoundError: No module named 'folder1_1_1'

如何以这种方式导入?或者我需要重新排列我的文件夹吗?在实际代码中,这个结构与 file1_1 有很多指向 file1_1_1 的导入语句,这实际上是很多文件。这就是单独的子文件夹 (folder1_1_1) 的原因 我检查了多个 S.O。问题,但我估计它们都有些不同。

PEP 366 在这里可能很有趣,但在这种情况下您不需要 -m 标志。在您的情况下,唯一的区别是 folder1_1/file1_1.py 中的导入。我从条目 name 开始导入,它是 运行,因此包含 folder1_1。您还可以在这些答案中看到更多信息:

  • How to do relative imports in python
  • python packaging for relative imports

最接近您的示例的是:

文件树

➜ tree
.
├── file1.py
└── folder1_1
    ├── __init__.py
    ├── file1_1.py
    └── folder1_1_1
        ├── __init__.py
        └── file1_1_1.py

file1.py

#!/usr/bin/env python3
from folder1_1.file1_1 import Test1_1 as lvl2


class Test1:
    randomnumber = 1
    sum = randomnumber + lvl2.sum
    print(sum)


if __name__ == "__main__":
    t1 = Test1()

folder1_1/file1_1.py

from folder1_1.folder1_1_1.file1_1_1 import Test1_1_1 as lvl3


class Test1_1:
    somenumber = 1
    sum = somenumber + lvl3.someothernumber
    print(sum)

folder1_1/folder1_1_1/file1_1_1.py

class Test1_1_1:
    someothernumber = 1
    print(someothernumber)

现在,如果您 运行 来自顶级文件夹:

./file1.py

它产生输出:

1
2
3