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

Mic*_*tuh 6 python python-import python-3.x

我有一个简单的项目结构,其中大部分是空的 python 文件,以便测试在线教程中的概念:

project
   |--package1
   |     |--__init__.py
   |     |--module1.py
   |
   |--package2
   |     |--__init__.py
   |     |--module2.py
   |
   |--__init__.py
Run Code Online (Sandbox Code Playgroud)

模块1.py:

from .package2.module2 import function2
Run Code Online (Sandbox Code Playgroud)

模块2.py:

def function2():
    return 0
Run Code Online (Sandbox Code Playgroud)

直接运行 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
Run Code Online (Sandbox Code Playgroud)

我尝试通过将 module2.py 放入项目文件夹本身并修改导入来降低问题的复杂性,因为我的教程建议它可以工作(来自 .module2 import function2),但这会产生相同的错误。

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

Python版本3.9.1

任何提示将不胜感激。

Jar*_*vis 7

您可以将外部包的路径加入到源路径中以进行相对模块导入:

import os, sys
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))
Run Code Online (Sandbox Code Playgroud)

我想在此之后,您可以直接执行以下操作:

from package2.module2 import function2
Run Code Online (Sandbox Code Playgroud)


Mic*_*tuh 2

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

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

PS C:\...\"parent of project folder"> python -m project.package1.module1
Run Code Online (Sandbox Code Playgroud)

另外,module1.py 需要修改:

from ..package2.module2 import function2
Run Code Online (Sandbox Code Playgroud)