Python的 -m 选项[option], 作用是将模块当作脚本来运行。

这里先介绍一个特殊变量__name__[官方解释], __name__ 是当前模块名,当模块被直接运行时模块名为__main__, 当模块是被导入时, __name__就是模块本身的名字。所以,通过import方式来引入模块,__name__不等于__main__,而是当前的模块名称,但是任何在 if __name__ == '__main__': 下的代码都不会被执行。

我们在命令行下运行一个python文件的时候,需要指定这个文件的路径,然后python默认只会在当前路径下查找这个文件。在命令行加上-m参数,可以使python在查找路径的时候,除了当前路径,还去查找标准库的路径

一般情况,我们只是import标准库,但是加上 -m 参数就可以直接运行标准库。简单来说,-m给了第三方库一个直接运行的机会。比如下面的代码:

$ python3 http.server
# Output: python3: can't open file 'http.server': [Errno 2] No such file or directory
$ python3 -m http.server
# Output: Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

所以如果通过-m直接运行本地package的时候,那么这个文件夹中必须包含一个名为 __main__.py 的文件,否则抛出异常(can’t find ‘main’ module in ‘project’)。也就是说,当执行 python -m folder/package的时候,__main__.py会被首先调用和执行。