一篇文章彻底弄懂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
猜你喜欢
- 安装你可以从PyPI上直接安装这个库:pip install itsdangerous适用案例在取消订阅某个通讯时,你可以在URL里序列化并
- 前言小伙伴a,b,c围着吃火锅,当菜上齐了,请客的主人说:开吃!,于是小伙伴一起动筷子,这种场景如何实现Event(事件)Event(事件)
- 1、首先看SSM(Spring+SpringBoot+Mybatis)的依赖<project xmlns="http://m
- editTable.js 提供编辑表格当前行、添加一行、删除当前行的操作,其中可以设置参数,如:operatePos 用于设置放置操作的列,
- Python单例模式的两种实现方法方法一 import threading class Singleton(object): &
- 本文介绍了python opencv之SURF算法示例,分享给大家,具体如下:目标:SURF算法基础opencv总SURF算法的使用原理:上
- 目录:1.安装python32.安装flask3.简单的服务器代码编写4.设置FLASK_APP路径并启动服务器程序1.安装python3p
- 概述从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类
- list*n生成多维数组与for循环生成多维数组的区别本文主要介绍生成二维数组的方法,同时解释使用list * n 方式所存在的问题。1.从
- 当我想要完美的使用:nth-child或者:nth-of-type的时候有点儿头晕。你越理解它们,就能写出越好的CSS规则!在这些简单的”秘
- 本文实例为大家分享了selenium+python京东自动登录及秒杀的代码,供大家参考,具体内容如下运行环境:python 2.7pytho
- 一、yield运行方式我们定义一个如下的生成器:def put_on(name): print("Hi {}, 货物来了,准备搬到
- 这是一篇关于使用JScript RuntimeObject(MSDN)调试的文章。虽然这些例子中的大多数在其他浏览器中不能运行,但在IE 5
- 小张的Pycharm最近弹出提示框 Your license has expired提示过期....纳尼!!!!是不是看到这个也很头疼,。于
- PHP count_chars() 函数实例返回一个字符串,包含所有在 "Hello World!" 中使用过的不同字符
- ①差集方法一:if __name__ == '__main__':a_list = [{'a' : 1},
- 目录1. 递归函数与回溯深搜的基础知识2. 求子集 (LeetCode 78)3. 求子集2 (LeetCode 90)4. 组合数之和(L
- 1. 用途(?(id/name)yes-pattern|no-pattern)的作用是:对于给出的id或者name,先尝试去匹配
- 数据加密是一种保护数据安全的技术,通过对数据进行编码,使得未经授权的用户无法读取或改动数据。加密是通过使用加密算法和密钥实现的。加密算法是一
- <script>var d = '2013-07-21';var nd = d.replace(new RegE