if __name__ == “__main__”: 做什么?
在执行代码之前, Python解释器读取源文件并定义一些特殊变量/全局变量。
如果Python解释器将该模块(源文件)作为主程序运行,它会将特殊的 __name__ 变量设置为具有值“__main__” 。如果此文件是从另一个模块导入的,则 __name__ 将设置为模块的名称。模块的名称可用作 __name__ 全局变量的值。
模块是包含Python定义和语句的文件。文件名是后缀.py的模块名。
当我们将文件作为命令执行到Python解释器时,
python script.py
Python3
# Python program to execute
# main directly
print ("Always executed")
if __name__ == "__main__":
print ("Executed when invoked directly")
else:
print ("Executed when imported")
Python3
# Python program to execute
# function directly
def my_function():
print ("I am inside function")
# We can test function by calling it.
my_function()
Python3
# Python program to use
# main for function call.
if __name__ == "__main__":
my_function()
import myscript
myscript.my_function()
- 所有处于缩进级别 0 [Block 1] 的代码都会被执行。定义的函数和类已经定义好了,但是它们的代码都没有运行。
- 在这里,当我们直接执行 script.py 时,__name__ 变量将是__main__ 。因此, if block[Block 2] 中的代码仅在该模块是您的程序的入口点时才会运行。
- 因此,您可以通过测试 __name__ 变量来测试您的脚本是直接运行还是被其他东西导入。
- 如果脚本当时被其他模块导入, __name__将是模块名称。
为什么我们需要它?
例如,我们正在开发旨在用作模块的脚本:
Python3
# Python program to execute
# function directly
def my_function():
print ("I am inside function")
# We can test function by calling it.
my_function()
现在,如果我们想通过导入来使用该模块,我们必须注释掉我们的调用。而不是这种方法,最好的方法是使用以下代码:
Python3
# Python program to use
# main for function call.
if __name__ == "__main__":
my_function()
import myscript
myscript.my_function()
好处 :
- 每个Python模块都定义了它的 __name__,如果这是 '__main__',则意味着该模块正在由用户独立运行,我们可以执行相应的适当操作。
- 如果将此脚本作为模块导入另一个脚本中,则 __name__ 将设置为脚本/模块的名称。
- Python文件既可以作为可重用模块,也可以作为独立程序。
- if __name__ == “main”:仅当文件直接运行而不是导入时才用于执行某些代码。