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

Ric*_*sos 21 python relative-import

所以,我的文件/文件夹结构如下:

\n
project/\n\xe2\x94\x9c\xe2\x94\x80 utils/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 module.py\n\xe2\x94\x9c\xe2\x94\x80 server/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 main.py\n
Run Code Online (Sandbox Code Playgroud)\n

在里面project/server/main.py我尝试project/utils/module.py使用以下语法导入:from ..utils.module import my_function

\n

我正在使用 VSCode,当我输入模块路径时,它甚至会自动完成。但是当我运行该文件时project/server/main.py,我在标题中收到错误。

\n

我已经在堆栈溢出上阅读了有关此主题的数十个答案,但没有一个使用这样的示例。

\n

Nie*_*ano 41

这是一个很好地解释这个问题的参考文献。基本上,问题是__package__运行独立脚本时未设置。

\n

文件结构

\n
.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 project\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 server\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 utils\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module.py\n
Run Code Online (Sandbox Code Playgroud)\n

项目/服务器/main.py

\n
if __name__ == \'__main__\':\n    print(__package__)\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
$ python3 project/server/main.py\nNone\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以看到, 的__package__值为None这是一个问题,因为它是此处所述的相对导入的基础

\n
\n

__package__

\n

...该属性用于代替__name__计算显式相对导入,如 PEP 366 中所定义...

\n
\n

哪里PEP 366

\n
\n

提议的主要更改是引入新的模块级属性__package__. 当它存在时,相对导入将基于此属性而不是模块__name__属性。

\n
\n

要解决此问题,您可以通过-m 标志将其作为模块运行而不是独立脚本。

\n

输出

\n
$ python3 -m project.server.main  # This can be <python3 -m project.server> if the file was named project/server/__main__.py\nproject.server\n
Run Code Online (Sandbox Code Playgroud)\n

项目/服务器/main.py

\n
from ..utils.module import my_function\n\nif __name__ == \'__main__\':\n    print(__package__)\n    print("Main")\n    my_function()\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
$ python3 -m project.server.main\nproject.server\nMain\nMy function\n
Run Code Online (Sandbox Code Playgroud)\n

现在,__package__已设置,这意味着它现在可以解析上面记录的显式相对导入。

\n