Ric*_*sos 21 python relative-import
所以,我的文件/文件夹结构如下:
\nproject/\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\nRun Code Online (Sandbox Code Playgroud)\n在里面project/server/main.py我尝试project/utils/module.py使用以下语法导入:from ..utils.module import my_function。
我正在使用 VSCode,当我输入模块路径时,它甚至会自动完成。但是当我运行该文件时project/server/main.py,我在标题中收到错误。
我已经在堆栈溢出上阅读了有关此主题的数十个答案,但没有一个使用这样的示例。
\nNie*_*ano 41
这是一个很好地解释这个问题的参考文献。基本上,问题是__package__运行独立脚本时未设置。
文件结构
\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\nRun Code Online (Sandbox Code Playgroud)\n项目/服务器/main.py
\nif __name__ == \'__main__\':\n print(__package__)\nRun Code Online (Sandbox Code Playgroud)\n输出
\n$ python3 project/server/main.py\nNone\nRun Code Online (Sandbox Code Playgroud)\n我们可以看到, 的__package__值为None。这是一个问题,因为它是此处所述的相对导入的基础:
\n\n\n
__package__...该属性用于代替
\n__name__计算显式相对导入,如 PEP 366 中所定义...
哪里PEP 366:
\n\n\n提议的主要更改是引入新的模块级属性
\n__package__. 当它存在时,相对导入将基于此属性而不是模块__name__属性。
要解决此问题,您可以通过-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\nRun Code Online (Sandbox Code Playgroud)\n项目/服务器/main.py
\nfrom ..utils.module import my_function\n\nif __name__ == \'__main__\':\n print(__package__)\n print("Main")\n my_function()\nRun Code Online (Sandbox Code Playgroud)\n输出
\n$ python3 -m project.server.main\nproject.server\nMain\nMy function\nRun Code Online (Sandbox Code Playgroud)\n现在,__package__已设置,这意味着它现在可以解析上面记录的显式相对导入。
| 归档时间: |
|
| 查看次数: |
53187 次 |
| 最近记录: |