跳转至

用 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

参考