Flask Gunicorn 应用无法让 __name__ 等于 '__main__

10 投票
1 回答
5734 浏览
提问于 2025-04-17 17:34

我在这个文件 /home/myname/myapp/app.py 里有一些代码:

from flask import Flask

app = Flask(__name__)

print __name__

@app.route('/')
def index():
    return "Hello world!"

if __name__ == '__main__':
    print 'in if'
    app.run()

当我运行这个命令:

$ gunicorn app:app -b 127.0.0.2:8000

它显示:

2013-03-01 11:26:56 [21907] [INFO] Starting gunicorn 0.17.2
2013-03-01 11:26:56 [21907] [INFO] Listening at: http://127.0.0.2:8000 (21907)
2013-03-01 11:26:56 [21907] [INFO] Using worker: sync
2013-03-01 11:26:56 [21912] [INFO] Booting worker with pid: 21912
app

所以这个应用的 __name__app,而不是我需要的 __main__,这样我就无法执行那个条件语句了。
我试着在这个目录里放了一个空的 __init__.py 文件。下面是我的 nginx sites-enabled default 配置:

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

        root /home/myname/myapp;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                proxy_pass http://127.0.0.2:8000;
        }
}

编辑

... 虽然这个应用在我访问网站时确实会打印 'Hello world',但关键是我需要 __name__ 等于 '__main__'。我还想知道为什么它不是这样,以及如何让它等于 __main__

编辑 2

... 我刚刚意识到我不需要运行 app.run(),因为这正是 Gunicorn 的作用。真是的。不过我还是想弄清楚为什么 __name__ 不是 '__main__'

1 个回答

17

当你运行一个Python脚本时,如果这个脚本是程序的入口点,Python会把一个叫做__name__的东西设置为"__main__"。但是,当你用Gunicorn来运行这个脚本时,它会先把这个脚本导入进来,这样这个脚本就不是入口点了,因此__name__不会被设置为"__main__"

撰写回答