python -m是拿来干啥用的?

Python010

python -m是拿来干啥用的?,第1张

Ubuntu 18.04.1 LTS + python3.7

我有这么一个文件结构:

里面的内容是:

从下面这句话可以看出,-m这个命令行参数就是像运行一个脚本一样运行模块

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

所以我们试验一下(注意,既然是运行模块,就不要有.py后缀):

可以看到,除了调用方式不一样之外,sys.path也不一样:

可以看到, 不带 -m参数时是把当前模块 module2.py 目录 .../try_demo/package2 添加到 sys.path 中,而 -m参数时是把当前包 package2 目录 .../try_demo 添加到 sys.path

<font face="微软雅黑" color=#FF8C00 size=6> 然鹅这有什么用呢 </font>

我在module2.py的第二行加一句话,就能体会出作用:

再来看一下两种情况下的输出:

其实这个结果也是我们意料之内的,因为python解释器在导入import的时候会去搜索sys.path下的模块,当 不带 -m参数时,sys.path只包括到 /home/lsm/文档/try_demo/package2 ,当然不知道还有一个package1,而当 -m参数时,sys.path能包括到 /home/lsm/文档/try_demo ,此时package1就在 /home/lsm/文档/try_demo 下呀

至此可以总结出-m能给我们的好处是 :已知一个模块的名字,但不知道它的文件路径,那么使用“-m”就意味着交给解释器自行查找,在所有模块命名空间中查找,定位到脚本的路径,则当成脚本执行。

“-m”之后也可以直接接一个包的名字,那么解释器经过前面提到的查找过程,先定位到该包,但是会去执行它的 __main__ 子模块,也就是说,在包目录下必须要实现一个 __main__.py 文件。

换句话说,假设有个包的名称是“packname”,那么,“python -m packname”,其实就等效于 python -m packname.__main__ 。

赶紧试验一下是不是:

眼尖的小伙伴都已经看出来了在改进例子中的运行带-m参数的命令时,出现了:

module1 __name__ is: package1.module1 ,不再是 __main__ ,这个下次再查查为什么?我想跟大家都在用的用法: __name__ == '__main__' 有关联吧?

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

官方文档对于-m介绍

官方文档对于Executing modules as scripts的介绍

python -m freegames.connect 是在命令行中运行 Python 程序的方式。

-m 选项告诉 Python 解释器要运行模块作为程序。后面跟着的 freegames.connect 是要运行的模块的名称。 freegames 是一个库, connect 是 freegames 库里面的一个模块,这个模块里面有一些函数和定义。运行这条命令会让这个模块里面的函数执行,如果有需要运行的函数需要被调用。

请注意,这只是一个示例,如果你没有安装过 freegames 这个库的话,会报错。

如果你已经安装了freegames这个库,那么在命令行里面运行这条命令,会让connect这个模块里面的函数执行,如果有需要运行的函数需要被调用。如果你没有安装这个库,那么会报错,提示找不到这个模块。

这个命令的作用取决于这个freegames.connect模块里面实际上定义了什么。没有更多的信息可以确定它具体实现了什么功能。

如果你想知道这个命令具体执行了什么操作,可以查看freegames库里面connect模块的文档或者代码。

Python 解释器通常被安装在目标机器的/usr/local/bin/python3.5 目录下。将 /usr/local/bin 目录包含进 Unix shell 的搜索路径里,以确保可以通过输入:

命令来启动他。[1] 由于 Python 解释器的安装路径是可选的,这也可能是其它路径,你可以联系安装 Python 的用户或系统管理员确认(例如, /usr/local/python 就是一个常见的选择)。

在 Windows 机器上,Python 通常安装在 C:Python35 位置,当然你可以在运行安装向导时修改此值。要想把此目录添加到你的 PATH 环境变量中,你可以在 DOS 窗口中输入以下命令:

通常你可以在主窗口输入一个文件结束符(Unix 系统是 Control-D ,Windows 系统是 Control-Z )让解释器以 0 状态码退出。如果那没有作用,你可以通过输入 quit() 命令退出解释器。

Python 解释器具有简单的行编辑功能。在 Unix 系统上,任何 Python 解释器都可能已经添加了 GNU readline 库支持,这样就具备了精巧的交互编辑和 历史 记录等功能。在 Python 主窗口中输入 Control-P 可能是检查是否支持命令行编辑的最简单的方法。如果发出嘟嘟声(计算机扬声器),则说明你可以使用命令行编辑功能;更多快捷键的介绍请参考 交互式输入行编辑 历史 回溯。如果没有任何声音,或者显示 ^P 字符,则说明命令行编辑功能不可用;你只能通过退格键从当前行删除已键入的字符并重新输入。

Python 解释器有些操作类似 Unix shell:当使用终端设备(tty)作为标准输入调用时,它交互的解释并执行命令;当使用文件名参数或以文件作为标准输入调用时,它读取文件并将文件作为脚本执行。

第二种启动 Python 解释器的方法是 python -c command [arg] ... ,这种方法可以在 命令行 执行 Python 语句,类似于 shell 中的 -c 选项。由于 Python 语句通常会包含空格或其他特殊 shell 字符,一般建议将 命令 用单引号包裹起来。

有一些 Python 模块也可以当作脚本使用。你可以使用 python -m module [arg] ... 命令调用它们,这类似在命令行中键入完整的路径名执行 模块 源文件一样。

使用脚本文件时,经常会运行脚本然后进入交互模式。这也可以通过在脚本之前加上 -i 参数来实现。

调用解释器时,脚本名和附加参数传入一个名为 sys.argv 的字符串列表。你能够获取这个列表通过执行 import sys ,列表的长度大于等于1;没有给定脚本和参数时,它至少也有一个元素: sys.argv[0] 此时为空字符串。脚本名指定为 '-' (表示标准输入)时, sys.argv[0] 被设定为 '-' ,使用 -c 指令 时, sys.argv[0] 被设定为 '-c' 。使用 -m 模块 参数时, sys.argv[0] 被设定为指定模块的全名。-c 指令 或者 -m 模块 之后的参数不会被 Python 解释器的选项处理机制所截获,而是留在 sys.argv 中,供脚本命令操作。

从 tty 读取命令时,我们称解释器工作于交互模式 。这种模式下它根据主提示符来执行,主提示符通常标识为三个大于号( >>>);继续的部分被称为 从属提示符 ,由三个点标识( ... )。在第一行之前,解释器打印欢迎信息、版本号和授权提示:

输入多行结构时需要从属提示符了,例如,下面这个 if 语句:

关于交互模式更多的内容,请参见 交互模式。

默认情况下,Python 源文件是 UTF-8 编码。在此编码下,全世界大多数语言的字符可以同时用在字符串、标识符和注释中 — 尽管 Python 标准库仅使用 ASCII 字符做为标识符,这只是任何可移植代码应该遵守的约定。如果要正确的显示所有的字符,你的编辑器必须能识别出文件是 UTF-8 编码,并且它使用的字体能支持文件中所有的字符。

你也可以为源文件指定不同的字符编码。为此,在#! 行(首行)后插入至少一行特殊的注释行来定义源文件的编码:

例如,如果你的编辑器不支持 UTF-8 编码的文件,但支持像 Windows-1252 的其他一些编码,你可以定义:

这样就可以在源文件中使用 Windows-1252 字符集中的所有字符了。这个特殊的编码注释必须在文件中的第一或第二行定义。

Footnotes