文章目录
1 前言2 原理3 模块4 `__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 模块
Python中导入的包均已模块的形式进行导入,那模块是什么?即模块是能够独立运行的代码片段,在逻辑上与其它代码分开;可以理解为独立完成某一功能的代码段。Python中的模块可以是文件,包,类或者函数,它们都能独立完成一些功能
使用__name__属性来显示模块的名称:
import pandas as pd
print(pd.__name__)
输出的结果为: pandas 虽然我们使用了as,但是导入的模块仍按照pandas文件名进行导入
如果我们导入模块中的模块,那么将导入子模块而不是整个模块
from matplotlib import pyplot as plt
print(plt.__name__)
输出的结果为:matplotlib.pyplot,而输出print(matplotlib.__name__)则会报错: NameError: name 'matplotlib' is not defined 说明模块没有被导入
4 __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/
文章链接
发表评论