张芷铭的个人博客

python -m <模块名> 按模块名搜索并运行,自动处理 sys.path 和相对导入。

核心原理

python -m <模块名> 将指定模块以脚本方式运行:

  1. sys.path 搜索模块
  2. 将模块所在目录加入 sys.path 前端
  3. 设置 __name__ = "__main__"

-m vs 直接运行

方式命令sys.path相对导入
-mpython -m module模块目录✅ 正常
直接运行python script.py当前目录❌ 可能失败

典型用法

1
2
3
4
5
6
7
8
9
# 运行标准库模块
python -m http.server 8000
python -m pip install --upgrade pip

# 运行调试器
python -m debugpy --listen 5678 script.py

# 运行自定义包
python -m my_package

相对导入问题

1
2
3
4
my_project/
  ├── main.py
  └── utils/
      └── helper.py
1
2
# main.py
from .utils.helper import func  # 相对导入
1
2
3
4
5
# ❌ 直接运行失败
python main.py  # ImportError

# ✅ -m 运行成功
cd .. && python -m my_project.main

sys.path 说明

1
2
3
import sys
print(sys.path)
# ['', '/usr/lib/python3.10', ..., 'site-packages']
  • '':当前目录
  • 标准库路径
  • 第三方库路径

总结

  1. -m 按模块名查找,支持相对导入
  2. 直接运行按文件路径,当前目录加入 sys.path
  3. 包需要 __main__.py 才能被 -m 运行

Comments