用 Python 直接执行一个模块¶
python -m module-name
module-name
就是模块的名称(没有 .py
扩展名),也可以是包名,比如 pip
。如果是包的话,会执行包里的 __main__
模块。
和直接执行文件的区别¶
主要是 sys.path
不同。Python 按照 sys.path
中的路径顺序来搜索程序中 import 的模块和包。
直接执行文件 python script.py
,会将脚本文件所在的目录添加到 sys.path
。
执行一个模块 python -m module
,会将当前执行命令的路径添加到 sys.path
。
应用¶
包的目录结构
package1/
|-- __init__.py
|-- mod1.py
package2/
|-- __init__.py
|-- run.py
假设,在 run.py
中 import 了 mod1.py
。
直接执行 python run.py
是不行的,会提示找不到 package1
。
在 package2
所在的目录执行 python -m package2.run
是可以的。
__init__.py
和 __main__.py
¶
包的目录结构
pkg/
|-- __init__.py
|-- __main__.py
直接执行文件夹¶
python pkg
只有 __main__.py
被执行。
__name__
:'__main__'
。__package__
:''
。sys.argv[0]
:'pkg'
。__main__.py
所在的目录(pkg
文件夹的路径)被加进sys.path
。
模块方式执行¶
python -m pkg
先执行 __init__.py
,再执行 __main__.py
。
__init__.py
:__name__
:'pkg'
。__package__
:'pkg'
。sys.argv[0]
:'-m'
。
__main__.py
:__name__
:'__main__'
。__package__
:'pkg'
。sys.argv[0]
:__main__.py
文件的路径。
- 执行命令时的路径被加进
sys.path
。