在 python 的开发过程中经常需要用到if __name__ == '__main__' ?,那么你真的理解 if __name__ == '__main__' 的作用么?
在开发环境下:
我们定义一个test.py文件。代码如下:
def myTest():
print("test", __name__)
a = 1
b = 2
return a + b
if __name__ == '__main__':
print("1", __name__)
print("2", myTest())
运行test.py,控制台打印结果如下所示:
1 __main__
test __main__
2 3
当test.py作为执行文件的时候,__name__就是__main__。
那么当test.py作为一个模块,被另一个文件导入时,控制台会打印什么结果呢?
创建test2.py文件,代码如下:
from test import myTest
def myTest2():
myTest()
print("test2", __name__)
if __name__ == '__main__':
myTest2()
运行test2.py,控制台打印结果如下所示:
test test
test2 __main__
看到这里,我想你已经明白了 if __name__ == '__main__' 的作用了。
也就是说,当某个 python文件作为执行文件是,会执行 if __name__ == '__main__' 下面的相关代码;当 python 文件作为一个模块被另一个 python 文件调用时,那么 if __name__ == '__main__' 下面的相关代码不会执行。
那么在生产环境中呢?
首先我们先来看看app.py文件中的代码:
from flask import Flask
app = Flask(__name__)
# 调用配置文件的相关API
app.config.from_object('config')
@app.route('/hello')
def index():
return 'hello i use python'
if __name__ == '__main__':
app.run(debug=app.debug)
如果我们需要将项目布署到生产环境,app.py是作为一个模块被导入的。
如果我们没有添加if __name__ == '__main__':这句代码,那么将会出现两次启动,为什么呢?
我们知道在生产环境中是使用nginx+uwsgi布署代码的,如果不写if __name__ == '__main__':将会执行app.run(debug=app.debug),那么uwsgi也会启动该模块,导致出现双重启动。
所以在什么时候添加if __name__ == '__main__':是一件值得认真思考的事情。