1. Python运行方式的核心差异解析
在Python开发中,我们经常会遇到两种运行Python代码的方式:python xxx.py直接运行脚本和python -m package.module以模块方式运行。这两种方式看似相似,实则有着本质区别,特别是在处理包结构和导入机制时表现迥异。
1.1 运行机制的本质区别
直接运行脚本(python xxx.py):
- 解释器将目标文件视为独立脚本执行
- 文件路径可以是绝对路径或相对路径
- 脚本的
__name__属性被设置为"main" - Python不会将该文件视为任何包的一部分
- 搜索路径(sys.path)的第一个元素是包含该脚本的目录
模块方式运行(python -m package.module):
- 解释器将目标模块作为包结构的一部分执行
- 必须使用点分路径表示法(package.module)
- 模块的
__name__属性保持其完整限定名(如package.module) - Python会正确识别并处理包层次结构
- 搜索路径的第一个元素是当前工作目录
关键提示:模块方式运行时,Python会临时将空字符串(代表当前目录)添加到sys.path开头,这对后续的导入行为有重要影响。
1.2 导入行为的差异对比
两种运行方式在导入行为上的差异尤为明显,特别是在处理相对导入时:
| 行为特征 | 直接运行脚本 | 模块方式运行 |
|---|---|---|
| 相对导入支持 | 不支持 | 支持 |
__name__值 |
"main" | 完整模块路径 |
| 父包识别 | 无 | 有 |
| sys.path[0] |
