引用: 理解python的-m参数
python -m module 含义
使用 python -h,查看 -m 参数的说明: -m mod : run library module as a script (terminates option list)
意思是在 sys.path
中搜索指定模块module,并以 __main__
模块执行其内容。
简单来说就是将模块当做脚本来运行!
脚本中的import命令,用来引入模块,引入模块的过程,也会执行模块文件暴露在外的代码。不过,在 if __name__ == '__main__':
下的代码,不会被执行,因为import时的 __name__不等于__main__,而是当前的模块名称。
哪什么时候 __name__ 等于 __main__ 呢?直接运行某个.py文件的时候!
要把python的标准库中的模块,当成脚本来运行,其实就是运行模块文件中的包含在 if __name == '__main__': 下的代码,有些是测试代码,有些是功能代码。
而python标准库的代码文件,一定是与你的项目文件在不同的路径下。我们在命令行下运行一个.py文件,需要指定这个.py文件的路径,python默认只会在当前路径下查找这个.py文件。这就是-m参数出场的时候了,在命令行加上-m参数,可以使python在查找路径的时候,除了当前路径,还去查找标准库的路径。这样就可以直接在main命名空间下,运行标准库中的.py文件,也就是标准模块的脚本文件。
一般情况,我们只是import标准库,加上-m参数就可以直接运行标准库。这里要理解,标准库路径,同样也包含了各种通过pip install安装的第三方库,这些库有许多都是可以直接运行的。因此,-m参数的作用还是很大的,给了第三方库一个直接运行的机会。
python -m module 举例应用
比如python标准库中的http.server模块(在http这个package下面),如果没有-m参数,python会提示找不到,加上-m参数,就能够正常启动:
$ python3 http.server
python3: can't open file 'http.server': [Errno 2] No such file or directory
$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
我们再用-m参数直接运行一下tkinter模块,它提供了一点测试代码:
$ python3 -m tkinter
然后你会看到tkinter模块的测试代码运行效果:
看到这个窗口,你就可以肯定tkinter模块安装无误!
所以,-m参数只是增加了python的搜索路径,除了当前路径,再加上了标准库的路径,也就可以直接运行第三方库了。同时,注意一个细节,命令行不再需要.py
了,直接写模块名称,有.py时反而会出错。
$ python3 -m test
.......
----------------------------------------------------------------------
Ran 7 tests in 0.001s
OK
$ python3 -m test.py
/usr/bin/python3: Error while finding module specification for 'test.py' (ModuleNotFoundError: __path__ attribute not found on 'test' while trying to find 'test.py')
test.py文件在当前路径下,使用-m参数一样可以执行这个文件中的测试代码,但不能写.py。
python命令行的-m参数并不神秘,就是把模块当成脚本来运行,在命令行可以直接运行标准库和pip install安装的第三方模块代码。