使用python -m加载子模块时如何通过相对路径导入包内其他层级模块
相对导入实现方法
常规场景(推荐)
你用python -m运行包内子模块时,只要包结构符合规范,天然支持相对导入,不需要修改任何内置变量。
举个规范的包结构示例:
my_project/ ├── my_package/ # 你的根包 │ ├── __init__.py │ ├── foo/ │ │ ├── __init__.py │ │ └── bar.py │ └── submodule/ │ ├── __init__.py │ └── run.py # 你要运行的子模块
操作步骤:
- 切换到根包的父目录(也就是上面的
my_project目录) - 执行命令:
python -m my_package.submodule.run - 此时在
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
相关产品推荐
相关产品推荐

