一篇文章彻底弄懂Python中的if __name__ == __main__
作者:赵卓不凡 发布时间:2023-04-27 08:42:14
1. 引言
在Python相关代码中,我们经常会遇到如下代码段:
# stuff
if __name__ == "__main__":
# do stuff
本文将尽可能使用简单的样例来解释这里发生了什么,以及需要使用if __name__=="__main__"
的情形。请注意,上述代码中name
和main
前后有2个下划线字符。
闲话少说,我们直接开始吧!
2. 特殊变量
当我们正常运行我们的Python
脚本时,该脚本中的变量__name__
的值一般为__main__
。我们来看个示例:
# first.py
print(__name__)
我们在终端中运行上述脚本,代码如下:
python first.py
输出如下:
__main__
观察上述输出,当我们运行脚本first.py
的时候,变量__name__
的值被设置为__main__
。
3. 复杂的例子
上述示例相对简单,也相对容易理解。接着我们来举个具有多个文件的例子,这里假设我们有三个脚本,分别为a.py
,b.py
以及c.py
。
其中,a.py
的内容如下:
# a.py
print("__name__ in a.py:", __name__)
from b import *
from c import *
此时,b.py
的内容如下:
# b.py
print("__name__ in b.py:", __name__)
c.py
的内容如下:
# c.py
print("__name__ in c.py:", __name__)
如果我们运行命令python a.py
得到结果如下:
__name__ in a.py: __main__
__name__ in b.py: b
__name__ in c.py: c
注意在脚本a.py
中我们看到__name__
的值为__main__
,此时在脚本b.py
中__name__
的值为b
, 同时 c.py
中__name__
的值为c
。这是因为我们运行的脚本为a.py
,那么该脚本即a.py
中变量__name__
的值将会被设置为字符串__main__
.
此外,脚本b.py
和c.py
中的变量·__name__
分别保持为b
和c
,这是因为脚本b.py
和c.py
不是直接运行的脚本。而是我们运行的脚本a.py
调用了b.py
和c.py
中的print
函数。
如果我们单独运行python b.py
得到结果如下:
__name__ in b.py: __main__
相应的我们运行python c.py
,得到结果如下:
__name__ in c.py: __main__
观察上述两个输出,当我们直接运行脚本b.py
或c.py
,相应的脚本里的变量__name__
都将被设置为__main__
。
4. 使用场景
作为Python开发者,我们通常会在一个项目工程中创建多个Python
文件而不是将所有代码都写在一个Python
文件中。因此我们通常会有一个主的Python
文件用来作为项目工程的入口,同时其他文件包含一些辅助性的函数实现。
我们来看个示例,这里假设我们有两个Python
文件,如下:
# main.py
from helper import *
print(greet("bob"))
辅助函数实现 helper.py
内容如下:
# helper.py
def greet(name):
return "hello " + name
print(greet("testname"))
如果此时我们运行命令 python main.py
,得到结果如下:
hello bob
hello testname
主要上述的import
语句将从helper.py
中引入所有的语句,所以helper.py
中的测试语句print(greet("testname"))
也将被执行。虽然我们可以通过添加注释或者屏蔽注释来达到运行main.py
或helper.py
来控制该测试语句的输出,但是这种情形就是语句if __name__=="__main__"
大显身手的情形。
5. 解决方案
我们针对上述情形,进行代码整改,如下:
# main.py
from helper import *
print(greet("bob"))
我们修改文件 helper.py
内容如下:
def greet(name):
return "hello " + name
if __name__ == "__main__":
print(greet("testname"))
此时,我们执行命令python main.py
,得到结果如下:
hello bob
注意,此时helper.py
中的变量 __name__
的值为helper
, 所以helper.py
中的if
语句不成立,进而将不会执行我们的测试语句print(greet("testname"))
.
此时,如果我们单独运行命令python helper.py
,得到结果如下:
hello testname
单独运行helper.py
时,此时改脚本中的变量__name__
将被设置为__main__
,所以此时的测试语句将会被执行,输出相应的测试结果。
6. 总结
本文重点介绍了Python中常见的if __name__=="__main__"
,重点分析了其背后的原理和应用的场景。
来源:https://blog.csdn.net/sgzqc/article/details/124849467


猜你喜欢
- 本文实例讲述了python数据结构之图的实现方法。分享给大家供大家参考。具体如下:下面简要的介绍下:比如有这么一张图:  
- 上一次写的《Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面》(点击打开链接)部分老一辈的需求可能对这种后现代的风格并不满意,没
- 推荐idea最新激活码:最新Idea激活码永久激活(最新测试有效)https://www.jb51.net/article/178193.h
- 详细参考:https://gitee.com/copperpeas/uniapp-paymentuniapp-payment介绍uniapp
- 数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据
- 让长字符自动换行 (比如 URL 和 Email地址) 目的:让很长的字符串,能自动换行,但是不要把短的单词从中间断开。方法如下:<s
- 导入模块from bs4 import BeautifulSoupsoup = BeautifulSoup(html_doc,"h
- 说到转置操作,顺便提及矩阵与数组的区别:矩阵:数学里的概念,其元素只能是数值,这也是区别于数组的根本所在数组:计算机中的概念,代表一种数据组
- 从今天起,我将陆续将 ppk on JavaScript 的读书心得发布到这个blog上。ppk是我所景仰的一位web开发者,原因无它,只是
- 本文实例讲述了python使用socket连接远程服务器的方法。分享给大家供大家参考。具体如下:import socketprint &qu
- IE6这个东东在前端开发者的眼中恐怕都是一个恶梦之地,我说它万恶想来没人反对吧。依据现在卡当网的访问统计数据来看,从IE6来的访问量还是占到
- 很久以前做的东西,发出来大家玩玩!<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
- 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义
- Python字典的遍历方法有好几种,其中一种是for...in,这个我就不说明,在Python了几乎随处都可见for...in。下面说的这种
- 本文主要介绍我在利用Django写文章时,采用的注册方法。首先说一下整体逻辑思路:•处理用户注册数据,•产生token,生成验证URL,•发
- 本文实例为大家分享了js浏览器倒计时跳转页面效果,供大家参考,具体内容如下效果图:<!DOCTYPE html><html
- 在对dataframe进行分析的时候会遇到需要分组计数,计数的column中属性有重复,但又需要仅对不重复的项计数(即重复N次出现的项只计1
- 环境git : 2+前言最近两天,公司的git合并代码时,出现了严重的问题,浪费很多时间; 现在记录下; 情况是这样的,一个同事自己的本地分
- 在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。最好是用几个例子来说明一下。 比如,假设你要向模板传递一个 Python
- 1.创建vue项目vue create demodemo是项目名称2.安装axios进入demo里面打开终端(黑窗口),执行npm inst