执行Python文件时python -m path.to.file与python path/to/file.py的区别
Python两种执行命令的核心差异
- 模块搜索路径处理逻辑不同
- 执行
python path/to/file.py时,Python会将脚本文件所在的目录添加到sys.path的首位,优先从该目录下查找依赖模块 - 执行
python -m path.to.file时,Python会将执行命令时的当前工作目录添加到sys.path的首位,随后按照标准模块导入规则查找目标模块
- 执行
- 对运行目标的要求不同
python path/to/file.py仅要求目标是后缀为.py的Python脚本即可,不需要目标所在目录符合Python包结构,路径按照文件系统规则用斜杠分隔,必须加.py后缀python -m path.to.file要求目标是合法的Python模块路径,用点分隔层级,不能加.py后缀,目标对应的路径需要符合Python包结构要求;同时该方式还可以直接运行内置模块、已安装的第三方模块,比如python -m pip不需要本地存在pip.py文件即可执行
- 内置变量赋值不同
- 两种方式运行时目标文件的
__name__变量都会被设置为__main__,但python path/to/file.py运行时脚本的__package__变量会被赋值为None,python -m运行时模块的__package__变量会被正确赋值为对应的包名
- 两种方式运行时目标文件的
- 相对导入支持不同
- 直接运行包内的脚本
python path/to/package/module.py时,因为__package__为空,Python会将脚本识别为顶层文件,无法使用相对导入导入同包内的其他模块,会抛出ImportError: attempted relative import with no known parent package错误 - 用
python -m path.to.package.module运行时,__package__被正确赋值,包内的相对导入可以正常生效
- 直接运行包内的脚本
举个实际场景示例:
现有如下包结构
my_project/ ├── my_package/ │ ├── __init__.py │ ├── module_a.py │ └── module_b.py
如果module_b.py中写了相对导入代码from . import module_a,在my_project目录下执行:
python my_package/module_b.py会直接抛出相对导入错误python -m my_package.module_b可以正常运行
内容的提问来源于stack exchange,提问作者user14577621
相关产品推荐
相关产品推荐

