最全总结:把模块当做脚本来执行的 7 种案例及其原理
作者 | 写代码的明哥
来源 | Python编程时光(ID:Cool-Python)
用法举例
前面的文章里其实分享过不少类似的用法。比如:
1、 快速搭建一个 HTTP 服务
# python2
$ python -m SimpleHTTPServer 8888# python3
$ python3 -m http.server 8888
效果如下:
2、快速构建 HTML 帮助文档
$ python -m pydoc -p 5200效果如下:
3、快速进入 pdb 调试模式
$ python -m pdb demo.py
4、最优雅且正确的包安装方法
$ python3 -m pip install requests
5、快速美化 JSON 字符串
$ echo '{"name": "MING"}' | python -m json.tool
6、快速打印包的搜索路径
$ python -m site
效果如下:
7、用于快速计算程序执行时长
$ python3 -m timeit '"-".join(map(str, range(100)))'
原理剖析
上面的诸多命令,都有一个特点,在命令中都含有 -m 参数选项,而参数的值,SimpleHTTPServer, http.server, pydoc,pdb,pip, json.tool,site ,timeit 这些都是模块或者包。
通常来说模块或者包,都是用作工具包由其他模块导入使用,而很少直接使用命令来执行(脚本除外)。
Python 给我们提供了一种方法,可以让我们将模块里的部分功能抽取出来,直接用于命令行式的调用。效果就是前面你所看到的。
那这是如何实现的呢?
最好的学习方式,莫过于模仿,直接以 pip 和 json 模块为学习对象,看看目录结构和代码都有什么特点。
先看一下 pip 的源码目录,发现在其下有一个 __main__.py 的文件,难道这是 -m 的入口?
再看一下 json.tool 的源码文件,json 库下面却没有 __main__.py 的文件。
这就很奇怪了。
不对,再回过头看,我们调用的不是 json 库,而是 json 库下的 tool 模块。
查看 tool 模块的源代码,有一个名为 main 的函数:
但它这不是关键,main 函数是在模块中直接被调用的。
只有当 __name__ 为 __main___ 时,main 函数才会被调用。
if __name__ == '__main__':main()当模块被导入时,__name__ 的值为模块名,
而当模块被直接执行,__name__ 的值就变成了 __main__。
这下思路清晰了,我来总结一下:
想要使用 -m 的方式执行模块,有两种方式:
第一种:以 -m <package> 的方式执行,只要在 package 下写一个 __main__.py 的文件即可。
第二种:以 -m <package.module> 的方式执行,只要在 module 的代码中,定义一个 main 函数,然后在最外层写入下面这段固定的代码:
if __name__ == '__main__':main()
上面我将 -m 的使用情况分为两种,但是实际上,只有一种,对于第一种,你完全可以将 -m <package> 理解为 -m <package.__main__> 的简写形式。
实践一下
先把当前路径设置追加到 PATH 的环境变量中:
$ export PATH=${PATH}:`pwd`
先来验证一下第一种方法。
然后在当前目录下新建一个 demo 文件夹,并且在 demo 目录下新建一个 __main__.py 的文件,随便打印点东西。
# __main__.py
print("hello, world")
然后直接执行如下命令,立马就能看到效果。
$ python3 -m demo
hello,world
执行过程如下:
再来验证一下使用第二种方法。
在 demo 目录下再新建一个 foobar.py 文件:
# foobar.py
def main():print("hello, world")if __name__ == "__main__":main()
最后执行一下如下命令,输出与预期相符。
$ python3 -m demo.foobar
hello, foobar
-m 存在的意义
-m 实现的效果,无异于直接执行一个 Python 模块/脚本。
那么问题就来了,那我直接执行不就行啦,何必多此一举再加个 -m 呢?
这个问题很有意思,值得一提。
当我们使用一个模块的时候,往往只需要记住模块名,然后使用 import 去导入它就行了。
之所以能这么便利,这得益于 Python 完善的导入机制,你完全不需要知道这个模块文件存在哪个目录下,它的绝对路径是什么?因为 Python 的包导入机制会帮你做这些事情。
换句话说,如果你不使用 -m 的方式,当你要使用 python -m json.tool,你就得这样子写
$ echo '{"name": "MING"}' | python /usr/lib64/python2.7/json/tool.py
{"name": "MING"
}
如此一对比,哪个更方便?你心里应该有数了。
更多精彩推荐
☞连按 5 次 Shift 重改 CMD 和密码并重启电脑,这个漏洞你不能不知道!
☞如何判断领导是在培养你,还是压榨你?看这4点就够了
☞微信iOS版朋友圈可删除评论;华为回应安卓系统断供;银河麒麟操作系统V10发布| 极客头条
☞万字长文总结机器学习的模型评估与调参 | 附代码下载
☞什么?一个核同时执行两个线程?
☞交易平台搅局者“Uniswap之父”,不会编程的“失业青年”,出手即巅峰
点分享点点赞点在看
最全总结:把模块当做脚本来执行的 7 种案例及其原理相关推荐
- python mount回调函数_让Python脚本暂停执行的几种方法(小结)
1.time.sleep(secs) 参考文档原文: Suspend execution for the given number of seconds. The argument may be a ...
- 「雕爷学编程」Arduino动手做(28)——RGB全彩LED模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- 【spinning up】2.2 功能超全的强化学习画图脚本
功能超全的强化学习画图脚本 文章目录 功能超全的强化学习画图脚本 原始画图效果: 加了九大功能: 最终画图效果: 多个子图绘制和图例legend位置调整: 代码链接,有详细注释: 关于强化学习绘图的其 ...
- 【雕爷学编程】Arduino动手做(64)---RGB全彩LED模块
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...
- STM32单片机驱动全彩LED模块遍历百万种颜色
一.使用硬件 分享一个趣味的实验,单片机PWM驱动全彩LED模块,快速遍历100万种颜色. 单片机为STM32F103C8T6,三色LED模块如下图(图片来源于网络) 二.STM32CubeMx配置 ...
- Arduino使用SK6812(WS2812) 全彩RGB模块/ArduinoC、Mixly/Scartch
目录 编辑 1.概述 2.规格参数 3.实验器材 4.连接图 5.测试程序 (1)在Arduino IDE上使用 (2)在Mixly上使用 (3)在Scartch上使用程序 相关资料下载链接 1.概 ...
- 中国全碳化硅电源模块市场趋势报告、技术动态创新及市场预测
全碳化硅电源模块市场的企业竞争态势 该报告涉及的主要国际市场参与者有Mitsubishi Electric.Fuji Electric.CENGOL.Cree?Inc.Starpower.Semico ...
- 迅为IMX6开发板支持全网通4G模块丨GPS模块丨WIFI蓝牙丨千兆以太网
迅为i.MX6开发板丨迅为i.MX6Q开发板丨四核imx6开发板丨Cortec-A9开发板丨资料介绍: 特点: 处理器:Freescale Cortex-A9四核i.MX6Q主频1GHz 核心板配置: ...
- python@模块和脚本@module@script@package_import
文章目录 python@模块和脚本@module@script@包package refs 脚本 模块 导入模块 访问模块名@`__name__` 模块详解 from module import `* ...
最新文章
- IOS TableView实现省市联动
- python提高办公效率的例子_怎样的办公室设计更利于提高工作效率
- 用番茄工作法提升工作效率 (三)工作任务的管理(系列完结篇)
- 4.WaitForSingleObject函数分析
- linux内核申请内存的方法,Linux内核空间的内存申请常用函数
- MyEclipse中快捷键
- 计算机考研新大纲,2020考研计算机新大纲考情分析
- 工作316:uni-修改其他页面的时间逻辑
- html之figure元素和figcaption元素为图片声明标题
- 网站设计好怎么上传到服务器的,虚拟主机上传到网站的几个步骤
- Python Windows安装
- 巧用开源软件做好企业管理
- bzoj 1196: [HNOI2006]公路修建问题(贪心+最小生成树)
- 春节返乡,到底返的是什么?
- java--cmd乱码
- 手工制作夜光星星的方法
- 激活office 2007 的方法
- 计算机格式字体颜色,电脑怎么设置不同的字体颜色样式
- java实现mysql的导入导出_Java实现mysql导入导出Excel
- 数据中心的等级 数据中心的分层