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

使用python -m加载子模块时如何通过相对路径导入包内其他层级模块

相对导入实现方法

常规场景(推荐)

你用python -m运行包内子模块时,只要包结构符合规范,天然支持相对导入,不需要修改任何内置变量。
举个规范的包结构示例:

my_project/
├── my_package/ # 你的根包
│   ├── __init__.py
│   ├── foo/
│   │   ├── __init__.py
│   │   └── bar.py
│   └── submodule/
│       ├── __init__.py
│       └── run.py # 你要运行的子模块

操作步骤:

  1. 切换到根包的父目录(也就是上面的my_project目录)
  2. 执行命令:python -m my_package.submodule.run
  3. 此时在run.py中直接写相对导入语句即可,比如from ..foo import bar就能正常导入父层级的模块。

手动修改配置实现的方法(仅特殊场景使用)

如果你确实需要在直接运行脚本的场景下使用相对导入,可以通过修改__package__并补充sys.path的方式实现,__name__不需要修改。
操作步骤:

  • 在需要执行相对导入的脚本最开头添加以下代码:
import sys
from pathlib import Path

if __name__ == "__main__" and __package__ is None:
    # 把根包的父目录添加到模块搜索路径
    # 此处路径层级根据你的包结构调整,确保指向根包的上级目录
    sys.path.append(str(Path(__file__).parent.parent.parent.resolve()))
    # 手动设置__package__为当前模块所属的包路径
    __package__ = "my_package.submodule"

# 后面就可以正常写相对导入了
from ..foo import bar

注意事项

  • 手动修改__package__和sys.path属于临时兼容方案,可移植性差,容易出现路径匹配错误,非必要不推荐使用。
  • 绝大多数场景下用python -m的方式运行包内子模块是最优解,完全符合Python的模块导入设计规范,不需要额外调整配置。

内容的提问来源于stack exchange,提问作者Noldorin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:57:04