【问题标题】:NameError when putting variable declaration in if __name__ == '__main__':将变量声明放入 if __name__ == \'__main__\' 时出现 NameError:
【发布时间】:2023-02-05 21:19:18
【问题描述】:

我有一个名为 main.py 的 Python 文件。我在 Windows 上的 Python 3.9.13 上运行它。 进口独角兽 从 fastapi 导入 FastAPI

app = FastAPI()

@app.post('/c')
async def c(b: str):
    print(a)

if __name__ == '__main__':
    a = load_embeddings('embeddings')
    uvicorn.run('main:app', host='127.0.0.1', port=80)

运行它,然后调用 POST /c 将导致 500 错误,其中 NameError 'a' is not defined。

但是很明显a 将在服务器运行之前首先定义。如果我将 a 移到 if __name__ == '__main__': 之外,那么它会起作用,但它会导致 load_embeddings 因未知原因(3 个确切)而运行多次。由于load_embeddings对我来说需要很长时间,所以我不想重复执行。

我希望寻找其中任何一个作为我的问题的解决方案:停止 if __name__ == '__main__': 之外的任何内容多次执行,或者在 if __name__ == '__main__': 下定义时全局定义 a

注意:为了便于阅读,特意重命名了变量名。请不要给我任何关于编码风格/命名约定的建议。我知道社区很有帮助,但这不是重点,谢谢。

【问题讨论】:

标签: python variables fastapi uvicorn


【解决方案1】:

您可以通过将 a 变量定义移动到 c 函数内来解决此问题。然后,您可以在函数内添加一个检查,以仅在嵌入尚未加载时才加载它们。您可以通过使用全局变量来实现这一点,该变量将跟踪嵌入是否已加载。

这是一个例子:

import uvicorn
from fastapi import FastAPI

app = FastAPI()

EMBEDDINGS_LOADED = False

def load_embeddings(filename):
# Load embeddings code here
...

@app.post('/c')
async def c(b: str):
global EMBEDDINGS_LOADED
if not EMBEDDINGS_LOADED:
    load_embeddings('embeddings')
    EMBEDDINGS_LOADED = True
print(a)

if __name__ == '__main__':
uvicorn.run('main:app', host='127.0.0.1', port=80)

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多