作者 | 写代码的明哥

来源 | 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 种案例及其原理相关推荐

  1. python mount回调函数_让Python脚本暂停执行的几种方法(小结)

    1.time.sleep(secs) 参考文档原文: Suspend execution for the given number of seconds. The argument may be a ...

  2. 「雕爷学编程」Arduino动手做(28)——RGB全彩LED模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  3. 【spinning up】2.2 功能超全的强化学习画图脚本

    功能超全的强化学习画图脚本 文章目录 功能超全的强化学习画图脚本 原始画图效果: 加了九大功能: 最终画图效果: 多个子图绘制和图例legend位置调整: 代码链接,有详细注释: 关于强化学习绘图的其 ...

  4. 【雕爷学编程】Arduino动手做(64)---RGB全彩LED模块

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  5. STM32单片机驱动全彩LED模块遍历百万种颜色

    一.使用硬件 分享一个趣味的实验,单片机PWM驱动全彩LED模块,快速遍历100万种颜色. 单片机为STM32F103C8T6,三色LED模块如下图(图片来源于网络) 二.STM32CubeMx配置 ...

  6. Arduino使用SK6812(WS2812) 全彩RGB模块/ArduinoC、Mixly/Scartch

    目录 ​编辑 1.概述 2.规格参数 3.实验器材 4.连接图 5.测试程序 (1)在Arduino IDE上使用 (2)在Mixly上使用 (3)在Scartch上使用程序 相关资料下载链接 1.概 ...

  7. 中国全碳化硅电源模块市场趋势报告、技术动态创新及市场预测

    全碳化硅电源模块市场的企业竞争态势 该报告涉及的主要国际市场参与者有Mitsubishi Electric.Fuji Electric.CENGOL.Cree?Inc.Starpower.Semico ...

  8. 迅为IMX6开发板支持全网通4G模块丨GPS模块丨WIFI蓝牙丨千兆以太网

    迅为i.MX6开发板丨迅为i.MX6Q开发板丨四核imx6开发板丨Cortec-A9开发板丨资料介绍: 特点: 处理器:Freescale Cortex-A9四核i.MX6Q主频1GHz 核心板配置: ...

  9. python@模块和脚本@module@script@package_import

    文章目录 python@模块和脚本@module@script@包package refs 脚本 模块 导入模块 访问模块名@`__name__` 模块详解 from module import `* ...

最新文章

  1. IOS TableView实现省市联动
  2. python提高办公效率的例子_怎样的办公室设计更利于提高工作效率
  3. 用番茄工作法提升工作效率 (三)工作任务的管理(系列完结篇)
  4. 4.WaitForSingleObject函数分析
  5. linux内核申请内存的方法,Linux内核空间的内存申请常用函数
  6. MyEclipse中快捷键
  7. 计算机考研新大纲,2020考研计算机新大纲考情分析
  8. 工作316:uni-修改其他页面的时间逻辑
  9. html之figure元素和figcaption元素为图片声明标题
  10. 网站设计好怎么上传到服务器的,虚拟主机上传到网站的几个步骤
  11. Python Windows安装
  12. 巧用开源软件做好企业管理
  13. bzoj 1196: [HNOI2006]公路修建问题(贪心+最小生成树)
  14. 春节返乡,到底返的是什么?
  15. java--cmd乱码
  16. 手工制作夜光星星的方法
  17. 激活office 2007 的方法
  18. 计算机格式字体颜色,电脑怎么设置不同的字体颜色样式
  19. java实现mysql的导入导出_Java实现mysql导入导出Excel
  20. 数据中心的等级 数据中心的分层

热门文章

  1. 硅谷大厂也看「名校学历」?Reddit小哥灵魂拷问引起热议
  2. 【IEEE】2020 年AI's 10 To Watch名单新鲜出炉!MIT韩松、方飞、张含望等华人入选!...
  3. 新冠疫苗生产靠AI?看强生、普华永道玩转AI的秘密
  4. SAP PM 初级系列5 - 工作中心相关的配置
  5. 公司各个阶段 CTO 需要做什么?(下篇)
  6. 机器学习中的标签泄漏介绍及其如何影响模型性能
  7. 人脸识别争议再起 实际应用利弊几何?
  8. 探索强化学习算法背后的思想起源!
  9. AI洞观 | 一文读懂英特尔的AI之路
  10. SAP MM 103 + 105 移动类型组合初探