You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:43:22