美文网首页会Python就够了
充分理解 python -m mod

充分理解 python -m mod

作者: 藕丝空间 | 来源:发表于2018-01-02 17:56 被阅读837次

最近在看 __main__ 的官方文档 —— https://docs.python.org/3/library/main.html#module-__main__,提到一个 python -m 的用法,很是不理解,所以查找了很多文档,并进行了如下总结。

查看 Python 的 help 内容

$ python --help
...
-m mod : run library module as a script (terminates option list)
# 直译就是按照脚本的方式执行模块
...

有无 -m 参数的比较

1. python script.py # 直接执行脚本
2. python -m script.py # 当做模块的方式执行,相当于 import

一般情况下,我们会想当然的认为,有无参数 -m 对程序会有不同的影响,但是很可惜,第二种写法是会在程序执行之后报错的。其正确的写法是:丢掉 .py 后缀

首先直观的观察执行结果,Python 的版本是 3.6.3
编写 script.py 脚本,内容如下:

import sys
print(sys.path)
print(sys.modules)

直接执行脚本

$ python script.py
['/home/ossifrage/workspaces/python-m', '/usr/lib/python36.zip', '/usr/lib/python3.6', ...]
{..., '__main__': <module '__main__' from 'script.py'>, ...}

当做模块方式执行

$ python -m script
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', ...]
{..., '__main__': <module 'run' from '/home/ossifrage/workspaces/python-m/script.py'>, ..., 'runpy': <module 'runpy' from '/usr/lib/python3.6/runpy.py'>, 'pkgutil': <module 'pkgutil' from '/usr/lib/python3.6/pkgutil.py'>}

显示的内容还有很多,只突出显示出了不同的地方。

通过比较不同的地方,我们发现:

第一种方法——直接运行脚本,当前脚本所在的路径会加入到 sys.path 列表中,但是 sys.modules 字典中的 __main__ 的路径不是绝对路径,只是脚本名称

第二种方法——当做模块方式运行,当前脚本所在的路径不会加入到 sys.path 列表中,但是 sys.modules 字典中的 __main__ 的路径是绝对路径,同时,还引入了 runpypkgutil 两个模块

runpy 的用途:定位并执行该模块。主要用途在于实现命令行 -m 执行 python 模块的效果。

pkgutil 的用途:获取包里面的所有模块列表。pkgutil.get_data() 可读取包内任何文件内容。

模块的导入机制

其实,上面的内容涉及到了 Python 包模块的导入机制。

要理解模块的导入机制,得理解几个关键的名词。sys.path -> sys.modules -> < module >.__dict__。

sys.path:是一个列表。保存着模块的搜索路径。如果路径没有存在与该列表中,可使用 sys.path.append() 导入。

sys.modules: 是一个字典。所有加载到内存中的模块都存放在该字典中。当 import 一个模块的时候,首先会在这个字典中查找是否已经加载了目标模块。如果已加载,则将模块的名字加入到正在调用 import 的模块的 Local 命名空间(也就是< module >.__dict__)中。如果没有,则从 sys.path 查找,找到后载入内存,并加入到 sys.modules 字典,名称也将导入到当前模块的 Local 命名空间。

reference

相关文章

  • 充分理解 python -m mod

    最近在看 __main__ 的官方文档 —— https://docs.python.org/3/library/...

  • python -m module [arg]

    使用python --help查看:-m mod : run library module as a script...

  • 中国剩余定理

    用中国剩余定理求解同于式组 / x≡b1 (mod m1)| x≡b2 (mod m2)| x≡b3 (mod m...

  • 无标题文章

    由RSA算法知,C=M^e mod N则,C1=M^e1 mod N C2=M^e2 mod N由扩展欧几里得算...

  • RSA破解作业

    算法思想: 加密过程:c=M^e mod N。解密过程:M=c^d mod N。取c1=2^e mod N,将c和...

  • Django初实

    Django是由python写的开放源代码的Web框架,有两个框架模式MVC和MVT。 MCV M --> mod...

  • Module & Package in Python

    环境:python 2.7.11,python3.5基本相同。 Contents [TOC] Python Mod...

  • 新手的WindowsServer+Apache+Mod_wsgi

    方案 :Flask + mod_wsgi + ApacheFlask: 一个Python的web框架mod_ws...

  • Go常用命令之go mod

    Go mod Go mod 的三种开启模式 GO111MODULEon:支持Go mod模式off:不支持Go m...

  • 蓝桥杯-斐波那契

    标题:斐波那契 【数据格式】输入为一行用空格分开的整数 n m mod (0 < n, m, mod < 10^1...

网友评论

    本文标题:充分理解 python -m mod

    本文链接:https://www.haomeiwen.com/subject/uysqnxtx.html