Python相对导入何时加圆点?与m-switch有何关联?
Python相对导入与脚本运行的冲突问题
我有一个简单的示例项目,文件结构如下:
folder __init__.py foo.py foobar.py script.py
在foobar.py中,我通过from .foo import foo导入函数foo(随后在函数foobar中调用);在script.py中,通过from .foobar import foobar导入函数foobar(随后执行该函数)。
但导入语句里加不加圆点,会因脚本运行方式不同触发不同错误:
- 加圆点时可能触发:
ImportError: attempted relative import with no known parent package - 不加圆点时可能触发:
ModuleNotFoundError: No module named 'foobar'
(代码有对应的示例项目,还有使用绝对路径的版本)
带圆点的情况
以下两种场景下,带圆点的相对导入可以正常工作:
- 使用
-m参数运行脚本:python -m project.folder.script - 在Python控制台中导入:
from project.folder.foobar import foobar
截图展示了带圆点时,使用和不使用-m参数运行脚本的成功与失败情况。
不带圆点的情况
我不需要在不使用-m参数的情况下运行脚本(不过如果能支持会更方便,毕竟IDE有直接运行的按钮)。
截图展示了不带圆点时,使用和不使用-m参数运行脚本的失败与成功情况。
路径细节
我特意查看了所有场景下script.py的__name__和__file__:__name__始终是字符串'__main__'。
截图展示了这些参数的具体情况。
结论
目前看来我只能选择加圆点的相对导入,配合-m参数运行脚本(这点有点麻烦,因为我的IDE没有对应的自动补全)。但我还是想弄明白,为什么明明文件位置完全相同(只是同一文件夹内的相邻文件),却会出现两种导入方式的冲突?
常有人说圆点是用来向上导航目录的(类似HTML和PHP里的../),但这个说法在这里似乎说不通,毕竟我只是在同一文件夹内导入文件。
内容的提问来源于stack exchange,提问作者Watchduck
相关产品推荐
相关产品推荐

