如何在 AWS Elastic Beanstalk 或 Google App Engine 上使用没有 pip 安装的 Python 库?

Posted

技术标签:

【中文标题】如何在 AWS Elastic Beanstalk 或 Google App Engine 上使用没有 pip 安装的 Python 库?【英文标题】:How to use a Python library with no pip install on AWS Elastic Beanstalk or Google App Engine? 【发布时间】:2018-06-06 22:31:10 【问题描述】:

我有一个使用 Python 库 PyDDE 的 Flask Web 服务,它分布在 PyPI 上,但不知何故无法安装 pip。我可以使用pip install git+https://github.com/hensing/PyDDE.git 在我的本地环境中安装这个库,或者克隆并安装setup.py

但是,当我尝试在 AWS Elastic Beanstalk 或 Google App Engine 灵活环境上上传和构建项目时,他们无法找到该库的匹配分布,这成为一个问题。

有什么办法可以解决这个问题吗?

这是来自 GAE Flexible 的错误消息:

Step #1:   Could not find a version that satisfies the requirement PyDDE (from -r requirements.txt (li
ne 7)) (from versions: )
Step #1: No matching distribution found for PyDDE (from -r requirements.txt (line 7))
Step #1: The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 1
Finished Step #1
ERROR
ERROR: build step "gcr.io/cloud-builders/docker@sha256:331786b295647a4560ed004a46761ee91409e754df7ffa7
54a67000bd020729a" failed: exit status 1
Step #1:
------------------------------------------------------------------------------------------------------

ERROR: (gcloud.app.deploy) Cloud build failed. Check logs at https://console.cloud.google.com/gcr/buil
ds/6ace1019-8bf5-434b-b916-5c6cae84de9f?project=project-190120 Failure status: UNKNOWN: Err
or Response: [2] Build failed; check build logs for details

这是我的requirements.txt

Flask==0.12.2
Werkzeug==0.12.2
gunicorn==19.7.1
pandas>0.20.0
numpy>1.13.0
scipy>0.19.0
PyDDE
google-api-python-client

更新:

我在requirements.txt中添加了这一行:

-e git+git://github.com/hensing/PyDDE.git#egg=PyDDE

它适用于 GAE。

谢谢@hansaplast !!

但是,AWS Elastic Beanstalk 不接受此requirements.txt。它抛出这个错误:

INFO: Created CloudWatch alarm named: awseb-e-3tu2ajdxug-stack-AWSEBCloudwatchAlarmLow-8NOPIs-s-rAAEH
ERROR: Your requirements.txt is invalid. Snapshot your logs for details.
ERROR: [Instance: i-03e92fa3c58b6e010] Command failed on instance. Return code: 1 Output: (TRUNCATED).
..)
  File "/usr/lib64/python2.7/subprocess.py", line 541, in check_call
    raise CalledProcessError(retcode, cmd)
CalledProcessError: Command '/opt/python/run/venv/bin/pip install -r /opt/python/ondeck/app/requirements.txt' returned non-zero exit status 2.
Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/03deploy.py failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
INFO: Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
ERROR: Create environment operation is complete, but with errors. For more information, see troubleshooting documentation.

【问题讨论】:

可以分享一下错误信息吗? 你也可以把requirements.txt的内容放到你的问题里吗? 如果你使用 requirements.txt,你可以尝试将-e git://https://github.com/hensing/PyDDE.git 添加到requirements.txt 作为proposed by this answer 吗? ` 【参考方案1】:

我能够通过以下方式解决类似问题:

创建一个配置文件来安装 git,因为 EB 上没有预安装:

路径:root/.ebextensions 文件:conf.config(名称无所谓,扩展名需要配置)

将以下内容添加到 conf.config 文件中:

packages:
  yum:
    git: []

将以下内容添加到您的 requirements.txt:

-e git://github.com/hensing/PyDDE.git#egg=PyDDE

重新运行eb deploy

链接: - https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environment-configuration-methods-during.html#configuration-options-during-ebcli-ebextensions

【讨论】:

【参考方案2】:

代替PyDDE,将其添加到您的requirements.txt

-e git://https://github.com/hensing/PyDDE.git#egg=PyDDE

AWS Elastic Beanstalk 不接受此要求.txt

您似乎已将git+git://github.com/hensing/PyDDE.git#egg=PyDDE 放入您的requirements.txt。从文件中删除git+#egg=PyDDE(如上所示),然后它应该可以工作了。

【讨论】:

看来GAE需要这部分#egg=PyDDE否则无效。【参考方案3】: 在您的项目文件夹中创建一个文件夹,例如lib 使用pip install -t <dir>将您想要的库安装到该文件夹​​中

在与您的app.yaml 文件相同的文件夹中创建一个名为appengine_config.py 的文件,并按如下方式进行编辑:

from google.appengine.ext import vendor 
vendor.add('lib') # Folder name
部署

【讨论】:

是的,我确实遵循了这个程序。但它仍然在部署时基于requirements.txt构建Docker容器中的所有库。 @EvyatarMeged 这仅适用于标准环境,不适用于灵活环境。

以上是关于如何在 AWS Elastic Beanstalk 或 Google App Engine 上使用没有 pip 安装的 Python 库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Elastic Beanstalk 上修改 Nginx 配置

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 中更改数据库配置

如何在 AWS Elastic Beanstalk 中选择特定平台?

如何使用 Elastic beanstalk 和 Dockerrun.aws.json 正确部署到 AWS?