【问题标题】:Cannot import name 'cygrpc' from 'grpc._cython' - Google Ads API无法从“grpc._cython”导入名称“cygrpc” - Google Ads API
【发布时间】:2022-05-02 15:53:03
【问题描述】:

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

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

{
"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 中创建项目/层,它们可以工作。我不知道我在这里做错了什么。

任何帮助将不胜感激!

版本:google-ads-14.1.0、python-3.9、grpcio-1.43.0

【问题讨论】:

  • 您介意分享您的 SAM 模板以用于 lambda 和层定义吗?
  • 我没有使用 SAM。我只是压缩并将其导入 lambda。您是否建议我研究一下 SAM,它会解决问题吗?

标签: python aws-lambda google-ads-api


【解决方案1】:

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

我相信你可以修复任何类型的 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 模块。文件夹“包”将是 如果找不到则自动创建。
  • 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 函数,一切顺利。

【讨论】:

  • 请您解释一下您在那里做了什么以及您的第一个方法和这个方法有什么区别?
  • @Amir 我成功安装了 python 模块,构建了项目并将其部署到 AWS lambda。以前我上传相同的项目,其中模块安装在 venv 和根目录中(示例命令:“pip install googleads -t 。)但仍然出现错误,这些方法适用于其他模块但不适用于 google-ads 和我不知道为什么。
  • 我认为问题的出现是因为 cygrpc 模块没有正确安装或某些路径出现故障。
  • 所以基本上我们可以说通过在 Linux 上安装模块解决了问题。 Windows 是问题所在。
  • 嗯,这是问题中一个棘手的部分,我想说在这种特殊情况下它很奇怪。因为我使用我的 Windows 机器、基于 linux 的 ec2 实例以及同样基于 linux 的 aws cloud9 尝试了同样的事情,甚至验证了文件夹结构,但它们都不起作用。在这三种情况下常见的一件事是代码正在运行,但是一旦我将它部署到 lambda,它就会给我错误。只有上述方法/答案有效,它再次基于 linux。 :D
【解决方案2】:

对我来说,只需在 docker 上的 ubuntu 上使用 pip 下载软件包,然后在 aws 上打包并上传它们就可以了

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2019-10-18
    • 2021-09-25
    • 2018-03-22
    • 2019-03-25
    • 2019-09-03
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多