文档章节

写了2年python,知道 if __name__ == '__main__' 什么意思吗?

o
 osc_a22drz29
发布于 2019/03/21 20:43
字数 772
阅读 8
收藏 0

精选30+云产品,助力企业轻松上云!>>>

在这里插入图片描述

相信刚接触Python的你一定有过如此经历,把所有的代码都写在 if __name__ == '__main__' 下,因为有人告诉你,这样比较符合 Pythonista 的代码风格。

殊不知这段代码的意义并不是一定要存在于执行代码中,而是在日常工作中,为了调试某个模块的正确性,我们往往会在当前模块下直接写一个 if __name__ == '__main__' ,测试逻辑写在下面,这样,在其他模块调用这个模块里的方法也好,类也好的时候,就不会去调用 if __name__ == '__main__' 下面的逻辑了。

原因很简单,因为 if __name__ == '__main__' 中的 __name__ 代表的就是当前执行的模块名。

python一切皆对象,所以python的模块也是对象,他有一个 built-in module,叫 __name__ ,存储着模块是如何被执行的,如果是执行当前模块,那么就显示 __main__ ,如果是被引用进来的,就显示被引用的路径。

python

好了,解释完了这个奇妙的 __name__ 后,我们就来看下如何在其他模块中调用这个 __main__ 呢?

首先来看下我们待被执行的代码:

import sys

def main(args):
  print(args)

if __name__ == '__main__':
  print("执行如下代码 __name__ == '__main__'")
  # 参数随便指定即可
  main(sys.argv[1:])

我们来执行看下结果:

python

接下来我们来使用 subprocess 模块来从其他模块中调用 __main__

import subprocess

process = subprocess.run(
  ['python', 'app.py', 'miracle'],
  stdin=subprocess.PIPE, stdout=subprocess.PIPE
)
print(process.stdout)

调用结果

python

使用 subprocess 的「优点」就是因为其实是通过创建一个子进程来执行的程序,所以不受子程序的影响,不会出现程序抛异常或主动退出进程导致主程序也退出的尴尬问题。 「缺点」就是需要创建子进程,相对来说资源消耗比较大。

subprocess 详细的用法详见这里不多做介绍,有兴趣的可以自行翻阅manual。

接下来我们使用 runpy 模块来调用看看

import runpy

runpy.run_path('app.py', run_name='__main__')

调用结果

python

使用 runpy 的优点就是不需要创建子进程,相对来说资源消耗比较小。 缺点就是主程序会受待执行程序的影响,会出现待执行程序中抛异常或主动退出会导致主程序也退出的尴尬问题。

runpy 详细的用法详见这里不多做介绍,有兴趣的可以自行翻阅manual。

这两种方法就是比较常用的在一个模块中执行另一个模块的 if __name__ == '__main__' 的方法。 总结来说就是,一个是在子进程中执行代码,一个是在当前进程中执行代码。

好啦,今天的内容就到这了,感兴趣的你,可以试试能不能走出来~

注公众号「Python专栏」,后台回复「mainmodule」,获取本文全套源码!

<img src="https://img2018.cnblogs.com/blog/649191/201902/649191-20190228222044609-1976101388.jpg" width="300" height="300" alt="Python专栏二维码" style="display:block; margin: 0 auto;" />

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Python 进制转换

<pre class="line-numbers"><code class="language-python">def bytes2human(n): </code></pre> <h2 id="toc_0">python语言n = (n+1)<<1是什么意思</h2> <p>前提n得有一个初始值,比如......

osc_f85py9gf
2019/05/14
1
0
Python中的if __name__ == '__main__'

问题 查看别人的代码经常会出现 if name == 'main',这是什么意思呢,有什么作用? 由于每个python模块(python文件)都包含内置的变量name,当运行模块被执行的时候,name等于文件名(包含了...

osc_o8pkds53
2019/02/14
1
0
Python 并发部分的面试题

<h2 id="toc_0">进程</h2> <ul><li>进程间内存是否共享?如何实现通讯?<br/>进程间内存不共享,可以通过<ol><li>Manage模块加锁 </li><li>通过队列或 </li><li>通过管道加锁 </li><li>socke......

osc_f85py9gf
2019/05/14
5
0
python 中if __name__ = '__main__' 的作用

python 中if name = 'main' 的作用 前言 首先我们要知道在python里面万物皆对象,模块也是对象,并且所有的模块都有一个内置属性 name。 一个模块的 name 的值取决于如何应用模块。 如果 im...

osc_zuzeo6xq
2019/05/30
4
0
if __name__ == '__main__' 如何正确理解

前言: 朋友眼中你是小明(name == '小明'), 你自己眼中你是你自己(name == 'main'), 你编程很好, 朋友调你去帮他写程序(import 小明, 这时你在朋友眼中: name == '小明'), 但你晚上也会打开x......

osc_ew3qs9k1
2018/03/27
1
0

没有更多内容

加载失败,请刷新页面

加载更多

MongoDB入门系列——3.可视化工具篇

点击上方,轻松关注!! 前面我们已经介绍了MongoDB怎么安装,接下来要安装他的可视化工具——Studio 3T。 先到这下载一个压缩包,百度网盘,https://pan.baidu.com/s/1M8mlWo334KE8I1_UA2Da...

学习Java的小姐姐
2018/11/08
0
0
分层图的绘制 python(来自国外课程)

Exercise 10: Hierarchical clustering of the grain data In the video, you learnt that the SciPy linkage() function performs hierarchical clustering on an array of samples. Use th......

齐勇cn
21分钟前
13
0
微信小程序超简单的双向绑定(类似vue的v-model)

<input model:value="{{value}}" />

祖达
22分钟前
9
0
为什么AngularJS在select中包含一个空选项? - Why does AngularJS include an empty option in select?

问题: I've been working with AngularJS for the last few weeks, and the one thing which is really bothering me is that even after trying all permutations or the configuration de......

技术盛宴
25分钟前
13
0
centos宝塔面板安装及常见错误处理(超级详细)

原文连接:https://www.wjcms.net/archives/centos%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E5%AE%89%E8%A3%85%E5%8F%8A%E5%B8%B8%E8%A7%81%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86%E8%B6%85%E7%......

神兵小将
46分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部