无法从 'grpc._cython' - Google 广告 API 导入名称 'cygrpc'

Cannot import name 'cygrpc' from 'grpc._cython' - Google Ads API

我想将 pycharm 中的工作 python 项目部署到 aws lambda。该项目正在使用 google-ads 库从 google 广告中获取一些报告数据。

我尝试通过将整个项目作为 zip 文件导入来部署 lambda,方法是将所有 folders/files 压缩到项目内部而不是项目文件夹本身。但是我收到以下错误:

{
"errorMessage": "Unable to import module 'main': cannot import name 'cygrpc' from 'grpc._cython' (/var/task/grpc/_cython/__init__.py)",
"errorType": "Runtime.ImportModuleError",
"stackTrace": []
}

假设 google-ads 库正在工作并且 grpc 有问题(顺便说一句 google-ads 本身包含 grpcio 和其他东西),我试图为 grpcio 创建一个层, cython, cygrpc 但错误仍然存​​在。

我在 aws lambda 中创建了 projects/layers,它们可以正常工作。我不知道我在这里做错了什么。

非常感谢任何帮助!

versions: google-ads-14.1.0, python-3.9, grpcio-1.43.0

在大量解决方法后回答我自己的问题。我把它变成了通用的,这样任何人都可以使用它。

我相信您可以修复任何类型的 ImportModuleError,只要您的部署包的文件结构、您的代码和体系结构都没有问题,只有这样您才能成功部署和 运行 您的代码。要修复您的结构和体系结构,请按照以下步骤操作:

1- 从 Microsoft Store (Windows 10) 安装“ubuntu 18.04 LTS”。

2- 打开 CMD 并 运行 以下命令:

  • ubuntu1804
  • 如果询问,请输入密码或创建用户。
  • cd /mnt/c您可以选择您的任何驱动器。我选了C.
  • mkdir my-lambda-folder 创建项目文件夹。
  • cd my-lambda-folder进入项目文件夹
  • touch lambda_function.py 创建名为 lambda_function.py
  • 的文件
  • 现在将您的代码复制并粘贴到您刚刚创建的文件中,即 lambda_function.py
  • pip install --target ./package your-module-name
  • 例如:pip install --target ./package google-ads 将安装 google-ads 文件夹 'package' 中的模块。文件夹 'package' 将是 如果找不到则自动创建。
  • cd package
  • zip -r ../my-deployment-package.zip . 这将在项目文件夹的根目录下创建带有已安装库的部署包,即 my-lambda-folder.
  • cd .. 返回项目文件夹的根目录。
  • zip -g my-deployment-package.zip lambda_function.py 将您的 lambda 函数添​​加到您刚刚创建的部署包中,即 my-deployment-package.zip.
  • (可选)在我的例子中,我使用的是 google-ads 并且 运行 我的代码在我的部署包中也需要 google-ads.yaml 文件。所以我 运行 附加命令 zip -g my-deployment-package.zip google-ads-yaml (我已经将此文件粘贴到我的项目文件夹中)。

3- 将 my-deployment-package.zip 上传到 AWS 控制台中的 lambda 函数,一切顺利。

对我来说,只需在 ubuntu 和 docker 上使用 pip 下载包,然后打包并上传到 aws