python AWS Lambda中没有名为“pydantic_core._pydantic_core”的模块,但已为基于快速API的代码安装库

vi4fp9gy  于 12个月前  发布在  Python
关注(0)|答案(6)|浏览(236)

FastAPI的AWS lambda部署给出以下错误:

[ERROR] Runtime.ImportModuleError: Unable to import module 'users_crud': No module named 'pydantic_core._pydantic_core'
Traceback (most recent call last):

字符串
虽然pydantic库已经安装了,但我使用的是AWS现在支持的3.10版本。

yjghlzjz

yjghlzjz1#

今天早上我也遇到了同样的错误。我检查了FastAPI的发行说明:新版本0.100.0有一些关于Pydantic的更改。我不太明白所有这些,但是一个快速的临时解决方案是将FastAPI版本固定为0.99.0。希望这对你也有帮助。

nwnhqdif

nwnhqdif2#

请参阅pydantic/pydantic#6557-基本上你可能已经安装了错误的架构pydantic-core

kh212irz

kh212irz3#

我在使用Serverless Framework时也遇到了同样的错误,在requirements.txt中有这些依赖项:

boto3==1.28.1
boto3-stubs==1.28.68
pydantic==2.4.0
pydantic[email]
pydantic-settings==2.1.0
pytest==7.3.1
pytest-mock==3.11.1
mock==5.0.2
pipreqs==0.4.13
black==23.7.0
backoff==2.2.1
mypy==1.5.1

字符串
但是没有任何依赖问题;当你在不同的架构中为你的Lambda构建依赖包时(在pip install步骤中),错误就会发生。在我的例子中,我使用了一个带有VSCode的devcontainer和我构建的Docker镜像:
1.我的第一个错误是这样的:

FROM ubuntu:latest


基本上,我没有在我的Dockerfile中指定操作系统架构。所以,我替换了这一行:

FROM arm64v8/ubuntu:latest

  1. serverless.yml中的第二个错误:如果您没有指定要在Lambda中使用的架构类型,AWS会将默认值设置为x86_64 - 64位x86架构(用于基于x86的处理器)。因此,我为所有Lambda添加了默认架构类型:
provider:
  name: aws
  runtime: python3.10
  architecture: arm64


我还在默认层定义中指定了架构类型:

layer:
      name: ${self:custom.resources.layers.commons.name}
      description: Python requirements lambda layer 
      compatibleRuntimes:
        - python3.10
      compatibleArchitectures: # optional, a list of architectures this layer is compatible with
        - arm64


最后,我再次部署了我的项目,解决了我的问题。

结论:您必须在用于部署Lambda的同一架构上构建依赖包。
PD:关于arm 64架构与x86架构:https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html?icmpid=docs_lambda_help#foundation-arch-adv

0qx6xfy6

0qx6xfy64#

在我的例子中,这个问题的解决方案是在Linux系统上运行pip install(它可以自动安装正确的版本)。我使用了没有fastapi的pydantic,并在lambda层使用py39x86架构创建了库。

此外,如果你无法访问Linux环境,直接解压缩“whl”文件也可能会有帮助。

ycggw6v2

ycggw6v25#

Lambda需要为特定架构构建的软件包。许多软件包都有适用于多种架构的发行版(请参阅pydantic-core的可用发行版)。默认情况下,pip安装适合您运行它的机器的发行版,这不一定与Lambda的架构相同。
但是你可以强制pip安装你想要的架构的软件包。如果你的Lambda使用x86_64,那么你应该选择平台manylinux2014_x86_64

pip install pydantic-core --platform manylinux2014_x86_64 -t . --only-binary=:all:

字符串
-t .-安装到当前目录。
但是,最好的方法是在所需的平台上安装所有依赖项,而不是为每个包安装依赖项。

pip install -r requirements.txt --platform manylinux2014_x86_64 --target ./python --only-binary=:all:


这是this answer

sr4lhrrt

sr4lhrrt6#

帮助我的是:
1.创建一个包含所有依赖项的lambda层:

  • 我尝试使用以下命令创建一个带有依赖项的lambda:
pip install --platform manylinux2014_x86_64 --target=<layer-folder> --implementation cp --python-version 3.11 --only-binary=:all: --upgrade langchain==0.0.349

pip install --platform manylinux2014_x86_64 --target=<layer-folder> --implementation cp --python-version 3.11 --only-binary=:all: --upgrade openai==1.6.1

字符串
(You可以选择使用requirements.txt -在我的例子中,我只需要这两个依赖项,并且langchain也需要openai。)2)确保依赖项匹配lambda架构(您有两个选项:x86_64或arm 64):

  • 你注意到在pip命令中我使用了这个:
--platform manylinux2014_x86_64 --target=python2 --implementation cp --python-version 3.11 --only-binary=:all:


这对我选择的架构是必要的。根据你的调整。3)确保依赖版本包含所有必要的类:

  • 最新版本的langchain(1.6.2)缺少一些显然是必需的模块(tracers.langchain_v1)。

值得一提的是,依赖关系非常大,因此将所有依赖关系放置在一个层中并附加该层非常有用。对于Python,该层应包含一个zip文件,路径如下:== python/lib/python3./site-packages。请参阅AWS文档。

相关问题