Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 用于Python和AWS Lambda的Google云平台API不兼容:无法导入名称';cygrpc&x27;_Python 3.x_Amazon Web Services_Google Cloud Platform_Aws Lambda - Fatal编程技术网

Python 3.x 用于Python和AWS Lambda的Google云平台API不兼容:无法导入名称';cygrpc&x27;

Python 3.x 用于Python和AWS Lambda的Google云平台API不兼容:无法导入名称';cygrpc&x27;,python-3.x,amazon-web-services,google-cloud-platform,aws-lambda,Python 3.x,Amazon Web Services,Google Cloud Platform,Aws Lambda,我正在尝试将Google云平台(特别是Vision API)用于带有AWS Lambda的Python。因此,我必须为依赖项创建一个部署包。然而,当我尝试创建这个部署包时,我会遇到几个编译错误,不管Python的版本是3.6还是2.7。考虑到3.6版,我遇到了“无法导入名称‘cygrpc’”的问题。对于2.7,我在.path文件中遇到了一些未知错误。我遵循AWS Lambda部署包说明。他们推荐了两种选择,但都不起作用/导致相同的问题。出于某种原因,GCP与AWS Lambda不兼容吗?怎么回事

我正在尝试将Google云平台(特别是Vision API)用于带有AWS Lambda的Python。因此,我必须为依赖项创建一个部署包。然而,当我尝试创建这个部署包时,我会遇到几个编译错误,不管Python的版本是3.6还是2.7。考虑到3.6版,我遇到了“无法导入名称‘cygrpc’”的问题。对于2.7,我在.path文件中遇到了一些未知错误。我遵循AWS Lambda部署包说明。他们推荐了两种选择,但都不起作用/导致相同的问题。出于某种原因,GCP与AWS Lambda不兼容吗?怎么回事

Python3.6和2.7都不适合我


注意:我在这里发帖是为了自己回答这个问题,因为我花了很长时间才找到解决方案,我想与大家分享我的解决方案。

TL;DR:您无法在Mac或任何您使用的pc上编译部署包。您必须使用特定的OS/“设置”来执行此操作,AWS Lambda使用该设置来运行您的代码。要做到这一点,您必须使用EC2

我将在这里提供一个关于如何让Google Cloud Vision在AWS Lambda for Python 2.7上工作的答案。这个答案有可能扩展到AWS Lambda上的其他API和其他编程语言

因此,我的解决方案之旅从Github开始,其他人也有同样的问题。有人发布的一个解决方案是

我在运行时遇到了同样的问题“无法导入名称‘cygrpc’” 兰姆达。用pip解决了这个问题,在AMI中安装google cloud vision amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2实例并导出 lib/python3.6/site-packages至aws lambda谢谢@tsaver

这部分是正确的,除非我读错了,但无论如何,它引导我走上了正确的道路。您必须使用EC2。以下是我采取的步骤:

  • 通过转到Amazon上的EC2来设置EC2实例。如果尚未阅读AWS EC2,请快速阅读。为amzn-ami-hvm-2018.03.0.20180811-x86_64-gp2或类似产品设置一个(即最新版本)
  • 获取您的EC2.pem文件。去你的候机楼。将cd放入.pem文件所在的文件夹中。使用

    ssh-i“your file name here.pem”ec2-user@ec2-ip-address-here.compute-1.amazonaws.com

  • 使用mkdir在您的实例上创建以下文件夹:google cloud vision、protobuf、google api python客户端、httplib2、uritemplate、google-auth-httplib2

  • 在您的EC2实例上,将cd放入google cloud vision。运行以下命令:

    pip安装googlecloudvision-t

  • 注意如果您得到“bash:pip:command not found”,则输入“sudo easy\u install pip”

  • 使用以下软件包重复步骤4,同时将cd'放入相应的文件夹:protobuf、google api python客户端、httplib2、uritemplate、google-auth-httplib2

  • 复制计算机上的每个文件夹。可以使用scp命令执行此操作。同样,在终端中,不是在EC2实例中,也不是在用于访问EC2实例的终端窗口中,运行该命令(下面是“google cloud vision”文件夹的示例,但对每个文件夹重复该命令):

    sudo scp-r-i your-pem-file-name.pem ec2-user@ec2-ip地址here.compute-1.amazonaws.com:~/google cloud vision~/Documents/your local directory/

  • 从AWS控制台停止您的EC2实例,这样您就不会被过度收费

  • 对于部署包,您需要一个包含所有模块和Python脚本的文件夹。要开始合并所有模块,请创建一个名为“模块”的空文件夹。将“google cloud vision”文件夹中的所有内容复制并粘贴到“模块”文件夹中。现在,仅将“protobuf”(原文如此)主文件夹中标题为“protobuf”的文件夹放在“modules”文件夹的“Google”文件夹中。同样从“protobuf”主文件夹中,将protobuf.pth文件和-info文件夹粘贴到Google文件夹中

  • 对于protobuf之后的每个模块,复制并粘贴在“模块”文件夹中标题为模块名称的文件夹、.pth文件和“-info”文件夹

  • 现在,所有模块都已正确组合(几乎)。要完成组合,请从“模块”文件夹中删除这两个文件:googleapis_common_protos-1.5.3-nspkg.pth和google_cloud_vision-0.34.0-py3.6-nspkg.pth。将“模块”文件夹中的所有内容复制并粘贴到部署包文件夹中。另外,如果您使用的是GCP,那么也可以将您的凭证粘贴到.json文件中

  • 最后,将Python脚本放到这个文件夹中,压缩内容(而不是文件夹),上传到S3,并将链接粘贴到AWS Lambda函数中,然后开始


  • 如果这里的内容不符合描述,请原谅我,给我发消息或随意编辑我的答案。希望这能有所帮助。

    基于@Josh Wolff的答案(非常感谢,顺便说一下!),这可以通过使用亚马逊提供的Lambdas Docker图像来简化

    您可以将这些库与项目源代码捆绑在一起,也可以像我在下面的
    Makefile
    脚本中所做的那样,将其作为AWS层上传

    layer:
        set -e ;\
        docker run -v "$(PWD)/src":/var/task "lambci/lambda:build-python3.6" /bin/sh -c "rm -R python; pip install -r requirements.txt -t python/lib/python3.6/site-packages/; exit" ;\
        pushd src ;\
        zip -r my_lambda_layer.zip python > /dev/null ;\
        rm -R python ;\
        aws lambda publish-layer-version --layer-name my_lambda_layer --description "Lambda layer" --zip-file fileb://my_lambda_layer.zip --compatible-runtimes "python3.6" ;\
        rm my_lambda_layer.zip ;\
        popd ;
    
    上述脚本将:

  • 如果您还没有Docker映像,请拉取它(上面使用的是Python 3.6)
  • 删除
    python
    目录(仅对运行第二个 时间)
  • 将所有需求安装到在projects/src目录中创建的
    python
    目录中
  • 压缩
    python
    目录
  • 上传AWS层
  • 删除
    python
    目录和zip文件
  • 确保您的
    requirements.txt
    文件包含Josh在上面列出的模块:google cloud vision、protobuf、google api python客户端、httplib2、uritemplate、goo