使用"-m"选项"将库模块作为脚本运行"是什么意思?

Pan*_*kus 31 python python-3.x

我是Python的新手(也是编程人员),虽然有很好的文档,但我无法理解-m指令的确切含义(正是在创建虚拟环境时:python3 -m venv my_env.

据我所知,从文档中可以看出,它代表"将库模块作为脚本运行":实际上这是我无法弄清楚的概念,没有运行命令的区别是什么-m.

而且,这是Python 3的一个特点吗?

pok*_*oke 54

Python模块只是脚本文件,位于Python可以找到它们的位置.与所有脚本一样,如果您知道它们的位置,您可以直接运行它们,例如python /path/to/module.py.

正确设计的模块通常不会做任何事情,除了设置东西(例如你可以导入的函数和类型),但它们通常不会有任何可见的副作用.这就是为什么你可以做到import sys,没有任何反应.

但是,某些模块在从命令行运行时可能会提供有用的东西.该实例包括venv但还http.serveridlelib:所有那些的是可以从其他模块中导入无副作用经常模块.

但是当直接执行时,它们都会做一些事情(例如,venv设置虚拟环境,http.server运行简单的HTTP服务器,并idlelib运行IDLE).这通常通过以下检查完成:

if __name__ == '__main__':
    print('Module is being executed directly, so do stuff here')
Run Code Online (Sandbox Code Playgroud)

这是一种识别正在直接执行的脚本/模块的特殊方式,或者是否只是从其他模块导入.您可以了解有关"做if __name__ == '__main__':什么?"的问题的更多信息.

因此,您可以直接使用python /path/to/module.py我们之前建立的模块.但这需要您了解模块的完整路径.这是-m选项发挥作用的地方:对于通常只能使用导入的模块import modulename,您可以使用python -m modulename直接运行该模块.就像你输入了它的完整路径一样.

因此,对于上面的例子,我们可以使用python -m venv,python -m http.server.或python -m idlelib.

  • 另一个很酷的例子是 `json.tool` 用于从 shell 进行漂亮的打印。`echo '{"1":"a","2":"b"}' | python -m json.tool` (7认同)
  • 很棒的答案。只是补充一点:如果它是一个“包”(一个目录而不是单个 .py 文件),则“python -m modulename”的工作方式与“python /path/to/package”略有不同。前者同时执行`__init__.py`和`__main__.py`,但后者**只执行**`__main__.py`。[(更多详细信息)](/sf/answers/4404666731/) (4认同)