理解python的-m参数

2019年11月6日 / 1次阅读 / Last Modified 2019年11月6日

python的-m参数,作用是将模块当做脚本来运行。这句话啥意思?

脚本中的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标准库中的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模块的测试代码
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安装的第三方模块代码。

-- EOF --

本文链接:https://www.pynote.net/archives/1468

相关文章

    留言区

    电子邮件地址不会被公开。 必填项已用*标注


    前一篇:
    后一篇:

    More

    麦新杰的Python笔记

    Ctrl+D 收藏本页


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top