当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Python 中 -m 的典型用法、原理解析与发展演变

    栏目:Linux/apache问题 时间:2019-11-13 01:36

    在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下:

    python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]

    本文想要聊聊比较特殊的“-m”选项: 关于它的典型用法、原理解析与发展演变的过程。

    首先,让我们用“--help”来看看它的解释:

    -m mod run library module as a script (terminates option list)

    "mod"是“module”的缩写,即“-m”选项后面的内容是 module(模块),其作用是把模块当成脚本来运行。

    “terminates option list”意味着“-m”之后的其它选项不起作用,在这点上它跟“-c”是一样的,都是“终极选项”。官方把它们定义为“接口选项”(Interface options),需要区别于其它的普通选项或通用选项。

    -m 选项的五个典型用法

    Python 中有很多使用 -m 选项的场景,相信大家可能会用到或者看见过,我在这里想分享 5 个。

    在 Python3 中,只需一行命令就能实现一个简单的 HTTP 服务:

    python -m http.server 8000
    
    # 注:在 Python2 中是这样
    python -m SimpleHTTPServer 8000

    执行后,在本机打开“ http://localhost:8000  ”,或者在局域网内的其它机器上打开“  http://本机ip:8000   ”,就能访问到执行目录下的内容,例如下图就是我本机的内容:

    与此类似,我们只需要一行命令“python -m pydoc -p xxx”,就能生成 HTML 格式的官方帮助文档,可以在浏览器中访问。

    上面的命令执行了 pydoc 模块,会在 9000 端口启动一个 http 服务,在浏览器中打开,我的结果如下:

    它的第三个常见用法是执行 pdb 的调试命令“python -m pdb xxx.py”,以调试模式来执行“xxx.py”脚本:

    第四个同样挺有用的场景是用 timeit 在命令行中测试一小段代码的运行时间。以下的 3 段代码,用不同的方式拼接 “0-1-2-……-99” 数字串。可以直观地看出它们的效率差异:

    最后,还有一种常常被人忽略的场景:“python -m pip install xxx”。我们可能会习惯性地使用“pip install xxx”,或者做了版本区分时用“pip3 install xxx”,总之不在前面用“python -m”做指定。但这种写法可能会出问题。

    很巧合的是,在本月初(2019.11.01),Python 的核心开发者、第一届指导委员会 五人成员之一的 Brett Cannon 专门写了一篇博客《 Why you should use "python -m pip" 》,提出应该使用“python -m pip”的方式,并做了详细的解释。

    他的主要观点是:在存在多个 Python 版本的环境中,这种写法可以精确地控制三方库的安装位置。例如用“python3.8 -m pip”,可以明确指定给 3.8 版本安装,而不会混淆成其它的版本。

    (延伸阅读:关于 Brett 的文章,这有一篇简短的归纳《 原来我一直安装 Python 库的姿势都不对呀! 》)

    -m 选项的两种原理解析

    看了前面的几种典型用法,你是否开始好奇: