无法从 '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
我想将 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