对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C,C++都需要有一个main函数作为程序的入口,也就是程序的运行会从main函数开始。同样,Java,C#必须要有一个包含Main方法的主类,作为程序入口。
但是python是脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的从头到尾逐行解释运行,也就是从脚本第一行开始运行,没有统一的入口。
因此,一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。
假设我们有一个x.py
x = 2
def main():
print("x:", x)
main()
Output:
x: 2
现在我们要计算公式y = 5x+1,需要从x.py
文件中取到x的值
y.py
如下所示代码段:
from x import x
def calc_y():
return 5*x +1
def main():
print("y: ", calc_y())
main()
Output:
x: 2
y: 11
我们希望只计算出y的值即可,不希望得到x的值,换句话说,我们只希望执行y.py
文件,不执行x.py
文件中的main()方法。此时,name == ‘main’ 发挥作用了!
我们改造一下x.py
文件即可:
x = 2
def main():
print("x:", x)
if __name__ == "__main__":
main()
此时,单独运行x.py
则正常允许
如果运行y.py
文件,只会打印y: 11
,即没有运行x.py
文件if __name__ == "__main__":
下的代码。