如何解决:尝试在没有已知父包的情况下进行相对导入

How to resolve: attempted relative import with no known parent package

为了测试在线教程中的概念,我有一个基本的项目结构,其中大部分是空 python 文件:

project
   |--package1
   |     |--__init__.py
   |     |--module1.py
   |
   |--package2
   |     |--__init__.py
   |     |--module2.py
   |
   |--__init__.py

module1.py:

from .package2.module2 import function2

module2.py:

def function2():
    return 0

运行 module1.py直接导致这个错误:

Traceback (most recent call last):
  File "c:\"blahblahblah"\project\package1\module1.py", line 1, in <module>
    from .package2.module2 import function2
ImportError: attempted relative import with no known parent package

我尝试通过将 module2.py 放入项目文件夹本身并按照我的教程建议修改导入来降低问题的复杂性(from .module2 import function2),但这会产生相同的结果错误。

旁注:我的印象是初始化文件对于我的 python 版本来说是不必要的,但我添加了它们以覆盖我的所有基础。

Python 版本 3.9.1

如有任何提示,我们将不胜感激。

你可以在源码路径中加入外包的路径进行相关模块导入:

import os, sys
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))

我想在这之后,你可以直接做:

from package2.module2 import function2

当您执行 Python 脚本时,脚本所在的特定目录被添加到路径中,而不是其父目录。

您必须将根目录附加到路径中,因此 Python 可以找到 package2.

为此,您可以使用 pathlib 模块(Python 3.4 或更高版本),这样修改 module1.py

import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

from package2.module2 import function2

Path.resolve() 方法 returns 文件的绝对路径,使用 parent.parent 可以获得 module1.py 的父目录(根目录)。因此,Python 现在可以找到 package2.

此外,由于您获得的是绝对路径,因此无论从 project 目录还是从 package1.

执行脚本,导入都会起作用

相对导入失败,因为 module1.py 直接执行时无法在其父文件夹中查找更多包。

正确的调用需要 -m 参数来表示 module1 是包中的一个模块。我的终端也需要上一级目录:

PS C:\...\"parent of project folder"> python -m project.package1.module1

另外,module1.py需要修改:

from ..package2.module2 import function2