1. 解决模块路径问题
当模块不在当前目录或需要确保正确的导入路径时,-m 会以 Python 模块搜索路径(sys.path)的方式运行模块,避免路径错误。
my_project/
├── my_package/
│ ├── __init__.py
│ └── module.py
└── scripts/└── run.py
-
问题:如果在
run.py中导入my_package.module,直接运行python scripts/run.py可能报错(因为my_package不在sys.path中)。 -
解决方案:使用
python -m scripts.run,Python 会自动将项目根目录添加到sys.path,确保正确导入包。
2. 支持包内相对导入
当模块需要以包的形式运行时,-m 允许使用相对导入(如 from . import submodule),而直接运行脚本会报错。
示例场景
假设 my_package/module.py 包含相对导入:
# module.py
from .submodule import some_functionif __name__ == "__main__":some_function()
-
直接运行:
python my_package/module.py→ 报错ImportError: attempted relative import with no known parent package。 -
正确方式:
python -m my_package.module→ 相对导入生效。
3. 确保使用当前 Python 环境的解释器
在虚拟环境中,直接运行脚本可能意外调用系统全局的 Python,而 -m 确保始终使用当前激活的 Python 环境。
示例场景
-
全局环境:系统默认 Python 3.8。
-
虚拟环境:项目使用 Python 3.10。
-
问题:直接运行
python script.py可能调用 Python 3.8。 -
可靠方式:
python -m script强制使用当前虚拟环境的 Python 3.10。
4. 运行第三方模块
许多第三方库也提供了命令行工具,可以通过 -m 来调用。例如:
pip
python -m pip install requests
使用 -m pip 可以确保调用的是当前 Python 环境下的 pip。
spaCy 模型下载
python -m spacy download en_core_web_sm
5. 运行整个包
一个包结构如下:
my_package/
├── __init__.py
└── __main__.py
你可以通过下面的命令运行整个包:
python -m my_package
这将执行 my_package/__main__.py 中的代码,使得你可以把整个包当作一个独立的应用来运行。

