一篇文章彻底弄懂Python中的if __name__ == __main__

 更新时间:2022年12月08日 16:24:31   作者:赵卓不凡  
在Python当中如果代码写得规范一些,通常会写上一句if '__name__'=='__main__:'作为程序的入口,下面这篇文章主要给大家介绍了关于如何通过一篇文章彻底弄懂Python中的if __name__ == __main__的相关资料,需要的朋友可以参考下

1. 引言

在Python相关代码中,我们经常会遇到如下代码段:

# stuff
if __name__ == "__main__":
    # do stuff

本文将尽可能使用简单的样例来解释这里发生了什么,以及需要使用if __name__=="__main__"的情形。请注意,上述代码中namemain前后有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.pyc.py中的变量·__name__分别保持为bc,这是因为脚本b.pyc.py不是直接运行的脚本。而是我们运行的脚本a.py调用了b.pyc.py中的print函数。

如果我们单独运行python b.py得到结果如下:

__name__ in b.py: __main__

相应的我们运行python c.py,得到结果如下:

__name__ in c.py: __main__

观察上述两个输出,当我们直接运行脚本b.pyc.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.pyhelper.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__" ,重点分析了其背后的原理和应用的场景。

到此这篇关于Python中if __name__ == __main__的文章就介绍到这了,更多相关Python中if __name__ == __main__内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 套娃式文件夹如何通过Python批量处理

    套娃式文件夹如何通过Python批量处理

    这篇文章主要介绍了套娃式文件夹如何通过Python批量处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python串口通信的接收与发送的实现

    Python串口通信的接收与发送的实现

    串口通信是指通过串口进行数据传输的一种通信方式,本文就来介绍一下Python串口通信的接收与发送的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • 详细讲解Python中的文件I/O操作

    详细讲解Python中的文件I/O操作

    这篇文章主要介绍了Python中的文件I/O操作,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Pandas中八个常用option设置的示例详解

    Pandas中八个常用option设置的示例详解

    通过pandas的使用,我们经常要交互式地展示表格(dataframe)、分析表格。本文整理了8个常用的配置选项,使用可以提高很多效率,需要的可以参考一下
    2022-06-06
  • Python实现批量下载图片的方法

    Python实现批量下载图片的方法

    这篇文章主要介绍了Python实现批量下载图片的方法,涉及Python基于urllib、urllib2及re等模块获取URL及正则匹配下载图片的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Numpy数组转置的实现

    Numpy数组转置的实现

    本文主要介绍了Numpy数组转置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python使用Django实现博客系统完整版

    Python使用Django实现博客系统完整版

    这篇文章主要为大家详细介绍了Python利用Django完整的开发一个博客系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Python表达式的优先级详解

    Python表达式的优先级详解

    在本篇文章里小编给大家整理了关于Python表达式的优先级的知识点内容,需要的朋友们可以学习下。
    2020-02-02
  • matplotlib.subplot()画子图并共享y坐标轴的方法

    matplotlib.subplot()画子图并共享y坐标轴的方法

    Matplotlib的可以把很多张图画到一个显示界面,本文主要介绍matplotlib.subplot()画子图并共享y坐标轴的方法,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 如何使用Django默认的Auth权限管理系统

    如何使用Django默认的Auth权限管理系统

    本文主要介绍了如何使用Django默认的Auth权限管理系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论