当您在腾讯云函数中使用FastAPI项目时,您很可能遇到报错No module named 'pydantic_core'
,完整的报错信息类似于这样:
{"errorMessage":"
1 code exit unexpected: Traceback (most recent call last):
File "/var/user/start.py", line 37, in <module>
from app.main import Host_IP, Host_Port
File "/var/user/app/main.py", line 38, in <module>
from fastapi import FastAPI
File "/var/user/fastapi/__init__.py", line 7, in <module>
from .applications import FastAPI as FastAPI
File "/var/user/fastapi/applications.py", line 16, in <module>
from fastapi import routing
File "/var/user/fastapi/routing.py", line 24, in <module>
from fastapi import params
File "/var/user/fastapi/params.py", line 5, in <module>
from fastapi.openapi.models import Example
File "/var/user/fastapi/openapi/models.py", line 4, in <module>
from fastapi._compat import (
File "/var/user/fastapi/_compat.py", line 21, in <module>
from fastapi.exceptions import RequestErrorModel
File "/var/user/fastapi/exceptions.py", line 3, in <module>
from pydantic import BaseModel, create_model
File "/var/user/pydantic/__init__.py", line 421, in __getattr__
module = import_module(module_name, package=package)
File "/var/lang/python39/lib/python3.9/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "/var/user/pydantic/main.py", line 29, in <module>
import pydantic_core
ModuleNotFoundError: No module named 'pydantic_core'
","requestId":"3e200f7a-ed11-11ef-a3d1-5254006a6788","statusCode":443}
这是因为FastAPI依赖于pydantic-core,而pydantic-core在不同的架构中,会安装不同的版本。
虽然云函数的本意是为了让我们不关注底层架构,但为了让程序正常运行,我们仍然需要调查云函数运行环境的底层架构,以便安装上对应的pydantic-core。
要调查云函数运行环境的架构,首先查看你的云函数的Python环境,这里我的是Python 3.9
然后运行以下命令,检查云函数运行环境的操作系统、硬件架构、C标准库的版本。
cat /etc/redhat-release
uname -m
ldd --version
知道这些信息后,把你的Python版本+控制台的输出发给AI,让他为你选择合适的pip的platform参数。
这里AI为我们推荐的参数组合是manylinux2014_x86_64或者manylinux_2_28_x86_64,我们先选第一个试试看。
我们拼接出最终的pip安装依赖的命令
python3.9 -m pip install -r requirements.txt \
--platform manylinux_2_17_x86_64 \
--target . \
--python-version 3.9 \
--only-binary=:all: \
--upgrade
这个命令中指定了--platform
和--python-version
参数,以便pip知道安装匹配云函数运行环境的pydantic-core包。
--platform
参数是刚刚AI给我们推荐的,--python-version
参数是我们自己知道的云函数的Python版本(我这个例子中,是Python 3.9)。
我的云函数的requirements.txt文件内容是这样的:
fastapi>=0.68.0
uvicorn>=0.15.0
我的云函数的app.py是这样的:
from fastapi import FastAPI, Query
import random
import uvicorn
app = FastAPI(
title="随机数生成器",
description="一个简单的随机数生成 API"
)
@app.get("/random")
async def get_random_number(
min_value: int = Query(default=0, description="最小值"),
max_value: int = Query(default=100, description="最大值")
):
if min_value >= max_value:
return {"error": "最小值必须小于最大值"}
random_number = random.randint(min_value, max_value)
return {
"random_number": random_number,
"range": {
"min": min_value,
"max": max_value
}
}
@app.get("/")
async def root():
return {"message": "欢迎使用随机数生成器 API"}
if __name__ == "__main__":
uvicorn.run(
app, # 直接用 app
host="0.0.0.0", # 允许外部访问
port=9000,
reload=False, # 不自动重载
log_level="info"
)
我们打开云函数的终端,先cd到src目录,然后运行依赖安装命令。
观察依赖安装命令运行的输出,确认被安装的pydantic_core的架构是和AI告诉我们的架构是一致的:
最终安装结果:
再观察现在的项目结构,可以看到pydantic_core的.so文件的Python版本也是正确的:
现在我们点击云函数的“部署”按钮,测试一下依赖是否安装到位,这个FastAPI服务能否正常运行。
用Postman请求一下服务,看看是否正常运行。