用 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。