python -m是"模块运行模式",无需关心当前工作目录,只要项目根目录在python的sys.path中,即可直接运行后面跟的模块,比直接执行.py文件更灵活,尤其适用于多目录结构的项目
shell
my_project/ # 项目根目录
├── src/ # 源码目录
│ ├── __init__.py # 标记为 Python 包
│ ├── core/
│ │ ├── __init__.py
│ │ └── utils.py
│ └── scripts/
│ ├── __init__.py
│ └── run_task.py # 业务脚本,依赖 src.core.utils
└── data/ # 数据目录
例如上面的项目中,若在根目录myproject/下,执行python src/scripts/run_task.py,若run_task.py中导入from src.core.utils import xxx,就会报ModuleNotFoundError: No module named 'src',因为python会将脚本所在目录src/scripts/作为默认根目录,无法识别上层src目录;
但若使用python -m src.scripts.run_task运行,python会将当前执行目录my_project(前提是加入PYTHONPATH中了)作为模块根目录,自动识别src包,完美解决跨目录导入问题