文章目录
- 1 前言
- 2 原理
- 3 `__name__`变量的作用
- 参考
1 前言
在很多Python
程序中,我们都会遇到if __name__ == "__main__"
的情况,却不知道为何要这样做
在很多编程语言中,如C、Java
等,都需要程序的入口,一般都是main
函数,程序会从main
函数开始执行。而Python
是脚本语言,是动态解释执行的,即从脚本的第一行开始,执行到最后,没有统一的入口。
Python
的源码文件除了直接可以被运行以外,还可以作为模块被导入,当模块被导入的时候,其中的源码会被执行(这部分代码被当作顶层代码,这里不做深入讨论,可以认为顶层代码即没有缩进的代码)
例子:
在相同路径创建import_file.py
def call_func():
print("call_func is called!")
pass
call_func()
创建run_file.py
import import_file
print("Hello run_file!")
输出:
call_func is called!
Hello run_file!
当我们导入某些包的时候,并不希望文件的某些顶层代码被执行,有些是需要被执行的比如import ...
,此时就需要使用if __name__ == "__main__"
:
修改import_file.py
文件
def call_func():
print("call_func is called!")
pass
if __name__ == "__main__":
call_func()
此时输出的结果为:
Hello run_file!
2 原理
首先我们需要直到__name__
变量是什么?
-
当
py
文件被当作模块导入的时候,此时__name__
为模块的名字。所谓模块的名字,导入的是一个文件,则模块名为文件名(无后缀),比如pandas
,那么__name__
的值为"pandas"
;如果导入的是一个类名或者变量名,则模块名为类名或者函数明,比如:from matplotlib import pyplot as plt
,__name__
的值为pyplot
,尽管使用as
-
在文件被Python解释器执行的时候,此时
__name__
的值为"__main__"
-
因此为了避免部分顶层代码的执行,使用
if
判断模块,来控制其执行
例子:
我们将上面的例子的输出改为print(__name__)
,首先我们执行import_file.py(没有使用if __name__ == "__main__":)
,程序的输出结果为:
def call_func():
print(__name__)
pass
# if __name__ == "__main__":
call_func()
>>>
__main__
我们再执行run_file.py
,可以看到输出为:
import import_file
print(__name__)
>>>
import_file
__main__
以上证明了我们的论述
3 __name__
变量的作用
反应一个包的结构
其中所有文件的内容均为: print(__name__)
执行
import my_module.b.c
输出:
my_module
my_module.b
my_module.b.c
结果:
可见导入时,都执行了__init__.py
,并产生了缓存,展示了包所在的层次结构
参考
如何简单地理解Python中的 if name == ‘main’: https://blog.csdn.net/yjk13703623757/article/details/77918633
Python 中的 if name == ‘main’ 该如何理解:https://blog.konghy.cn/2017/04/24/python-entry-program/