首页 > 解决方案 > 在 Python 中使用 __name__ 语句的区别

问题描述

我正在为我的 python 应用程序使用fastAPI和。uvicorn我使用 Uvicorn 发现了一个棘手的现象,这似乎是启动 python 代码创建竞争条件的方式。

我的第一次试验如下

# main.py
import uvicorn
app = App()

uvicorn.run(
    "main:app", 
    host="127.0.0.1", port=8080, log_level="debug", reload="true")

推出main.pypython main.py,我经历了

ERROR: [Errno 48] Address already in use错误。

我试图找出绑定的任何端口或地址,127.0.0.1:8080但我的 Mac 上没有进程。

但是,我的第二次试验如下:

import uvicorn
app = App()

if __name__ == "__main__":
    uvicorn.run(
        "main:app", 
        host="127.0.0.1", port=8080, log_level="debug", reload="true")

AFAIK,匹配__name__值意味着检查该模块直接启动或仅由其他python模块导入。

这背后究竟发生了什么?

标签: pythonuvicorn

解决方案


当您通过另一个文件导入模块时,其中的命令将运行。
如果您不添加该 if 语句,则 uvicorn.run... 命令将在您通过另一个文件导入时运行。
所以如果你这样做,只有函数、类等将被定义,然后你通过另一个文件导入它。但不是你的 uvicorn.run... 命令。只有当您从命令行运行该文件时,uvicorn.run... 命令才会运行。
如果您不明白,请看这里:https ://www.freecodecamp.org/news/if-name-main-python-example/


推荐阅读