尝试使用 __init__.py 在没有已知父包的情况下进行相对导入

nam*_*amo 4 python python-import importerror python-3.x

以下是我的项目的结构:

\n
Python_Projects/\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 project_1/\n            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_functions.py\n            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test.py\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sub_folder_add/\n                \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 add.py\n
Run Code Online (Sandbox Code Playgroud)\n

add.py中的代码:

\n
from .my_functions import addition\n
Run Code Online (Sandbox Code Playgroud)\n

运行code.py时出现错误:

\n
\n

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

\n
\n

Sor*_*ary 6

正如文档所说:

请注意,相对导入基于当前模块的名称。由于主模块的名称始终为"__main__",因此用作 Python 应用程序主模块的模块必须始终使用绝对导入。

因此,在将脚本作为主模块运行时,不应使用相对导入。相对导入在导入时会得到正确解析。

最简单的修复是:

  1. 确保您的根文件夹位于其中,sys.path以便解释器始终可以找到它。(如果没有,请手动添加)
  2. 从根文件夹开始使用绝对导入。

这样,您就失去了子模块/子包的可移植性,但无论您是否直接运行子模块,导入都会按预期工作。

通过失去可移植性,我的意思是,如果您决定更改子包的位置,则需要更改该包中的所有导入,即使 sob 模块在该包内相互指向。