What does if __name__ == “__main__”: do?

176 阅读2分钟

微信公众号:stackflow
如有问题或建议,请公众号留言
Question:https://stackoverflow.com/questions/419163/
最近更新:2018-12-29

需求分析

如题:
代码如下:

 1# Threading example
2import time
3import thread
4
5def myfunction(string, sleeptime, lock, *args):
6    while True:
7        lock.acquire()
8        time.sleep(sleeptime)
9        lock.release()
10        time.sleep(sleeptime)
11
12if __name__ == "__main__":
13    lock = thread.allocate_lock()
14    thread.start_new_thread(myfunction, ("Thread #: 1"2, lock))
15    thread.start_new_thread(myfunction, ("Thread #: 2"2, lock))

Answers

当python解释器运行源代码时, 它将执行所有能找到的代码。
在代码执行前,解释器会定义几个特定的变量。例如,如果解释器将该模块 (源文件) 作为主程序运行, 会设置__name__ == '__main__'。如果此文件是从另一个模块导入的, 则__name__将设置为模块的名称。
示例中的代码,假设是作为主函数来运行,即

1python threading_example.py

设置特殊变量后, 它将执行导入语句并加载这些模块。然后, 它将计算def块, 创建一个函数对象, 并创建一个名为 myfunction 的变量, 指向该函数对象。然后, 它将读取 if 语句, 并看到 __name__ 确实等于 "__main__", 因此它将执行显示在其中的代码块。
这样做的一个原因是, 有时编写一个模块 (a.py), 可以直接执行。或者, 也可以在另一个模块中导入和使用它。通过执行主程序检查, 你希望只将模块作为程序运行时执行该代码, 而不是在有人只想要导入你的模块并调用函数时执行该代码。
More 有更多解释

注: 如果将代码放在函数定义之前, 它将在 __name__之前执行。

 1print("This code executes before main."
2
3def functionA():
4    print("Function A")
5
6def functionB():
7    print("Function B")
8
9if __name__ == '__main__':
10    functionA()
11    functionB()

作为主函数执行的输出如下:

1This code executes before main. 
2Function A 
3Function B

如果导入此模块而不是用作主函数, 则在导入时将输出以下内容:

1This code executes before main.