python - 在 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.py
后python 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模块导入。
这背后究竟发生了什么?
解决方案
当您通过另一个文件导入模块时,其中的命令将运行。
如果您不添加该 if 语句,则 uvicorn.run... 命令将在您通过另一个文件导入时运行。
所以如果你这样做,只有函数、类等将被定义,然后你通过另一个文件导入它。但不是你的 uvicorn.run... 命令。只有当您从命令行运行该文件时,uvicorn.run... 命令才会运行。
如果您不明白,请看这里:https ://www.freecodecamp.org/news/if-name-main-python-example/
推荐阅读
- scala - scala中正态分布的百分比点函数(PPF)
- php - getimagesize:无法打开流:没有这样的文件或目录(查看:/Applications/MAMP/htdocs/project/resources/views/layouts/app.blade.php)
- amazon-web-services - AWS ELB 和管理证书。HTTPS 调用将域名添加到 API URL 调用
- android - Flutter 自动暗示Leading 不起作用
- c# - EntityFramework Core 3.0 Fluent API 多对多关系构建器创建额外的外键列
- flutter - 如何为文本表单字段添加两个验证器以接受和验证电子邮件或电话号码?
- c# - 如何在C#中获取一年的周开始日期(星期一)和结束日期(星期日)列表
- java - 新数组中的恒定步进值
- java - Java TCP Socket While循环和计数器接收数据X次
- firebase - 如何使用 ESP8266 监听 Firestore 的变化?