Numpy 如何为我的AWS Elastic Beanstalk应用程序安装matplotlib?

Numpy 如何为我的AWS Elastic Beanstalk应用程序安装matplotlib?,numpy,amazon-web-services,matplotlib,pip,amazon-elastic-beanstalk,Numpy,Amazon Web Services,Matplotlib,Pip,Amazon Elastic Beanstalk,我在AWS Elastic Beanstalk上部署matplotlib的时间很长。我的问题来自于一些依赖关系和EB部署随PIP安装的软件包的方式,并且已经尝试按照解决问题的方法 我首先尝试了增量部署,正如链接答案中所建议的那样,通过将matplotlib包堆栈的各个部分分阶段添加到我的requirements.txt文件中。但这会花费很长时间(对于每个阶段),并且容易出现故障和超时(这似乎会留下构建目录,从而使后续的包安装暂停) 因此,答案末尾提到的简单解决方案吸引了我:只要eb-ssh,用

我在AWS Elastic Beanstalk上部署matplotlib的时间很长。我的问题来自于一些依赖关系和EB部署随PIP安装的软件包的方式,并且已经尝试按照解决问题的方法

我首先尝试了增量部署,正如链接答案中所建议的那样,通过将matplotlib包堆栈的各个部分分阶段添加到我的
requirements.txt
文件中。但这会花费很长时间(对于每个阶段),并且容易出现故障和超时(这似乎会留下构建目录,从而使后续的包安装暂停)

因此,答案末尾提到的简单解决方案吸引了我:只要
eb-ssh
,用

source /opt/python/run/venv/bin/activate
pip手动安装
软件包。但我也不能让它工作。首先,我经常遇到左beind构建目录(如上所述)

但即使去掉这些,我还是会一直

Exception:
Traceback (most recent call last):
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/commands/install.py", line 278, in run
    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/req.py", line 1197, in prepare_files
    do_download,
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/req.py", line 1375, in unpack_url
    self.session,
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/download.py", line 582, in unpack_http_url
    unpack_file(temp_location, location, content_type, link)
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/util.py", line 625, in unpack_file
    untar_file(filename, location)
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/util.py", line 533, in untar_file
    os.makedirs(location)
  File "/opt/python/run/venv/lib64/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/opt/python/run/venv/build/xxxx'
响应
pip安装xxxx
(和
sudo-pip
失败,未找到
sudo:pip:command

我能做些什么来让AWS-EB工作?特别是,我需要做什么才能让简单的SSH+PIP方法工作;还是有其他更好更简单的方法我应该试试


FWIW,我有一个
.ebextensions/software.config

packages:
  yum:
    gcc-c++: []
    gcc-gfortran: []
    python-devel: []
    atlas-sse3-devel: []
    lapack-devel: []
    libpng-devel: []
    freetype-devel: []
    zlib-devel: []
以及一个以结尾的
requirements.txt

pytz==2014.10
pyparsing==2.0.3
python-dateutil==2.4.0
nose==1.3.4
six>=1.8.0
mock==1.0.1

numpy==1.9.1

matplotlib==1.4.2
大约4个小时后,我到达了numpy(正如EB VirtualNV中的
pip列表所报告的那样)

并且(如果有关系的话)正在使用策略的用户是策略组的一部分

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "elasticbeanstalk:*",
        "ec2:*",
        "elasticloadbalancing:*",
        "autoscaling:*",
        "cloudwatch:*",
        "s3:*",
        "sns:*",
        "cloudformation:*",
        "rds:*",
        "sqs:*",
        "iam:PassRole"
      ],
      "Resource": "*"
    }
  ]
}

我使用了许多方法在Windows和Linux系统上构建和部署numpy/scipy/matplotlib。我使用过系统提供的软件包管理器(aptitude,rpm)、第三方软件包管理器(pypm)、Python软件包管理器(easy_install,pip)、源代码版本,使用过不同的构建环境/工具(GCC,还有Intel MKL、OpenMP)。在这样做的过程中,我遇到了很多非常恼人的情况,但也学到了很多每种方法的优缺点

我没有弹性豆茎(EB)的经验,但我有EC2的经验。我看到您可以使用SSH连接到一个实例中,然后四处查看。因此,我在下面进一步提出的建议是基于

  • 上述经验和建议
  • 关于Beanstalk等的或多或少明显的边界条件
  • 您的应用程序场景,在这里的另一个问题中描述,等等
  • 事实上,你只是想让事情快速运转
我的建议:首先不要自己建造这些东西。不要使用pip。如果可能,尝试使用Linux发行版的包管理器,让它通过一个命令(例如,
sudo-apt-get-install-python-matplotlib
)处理您所需的所有安装工作

缺点:

  • 可能是旧的软件包版本,具体取决于使用的Linux发行版
  • 非优化构建(例如,未针对英特尔MKL构建,或未利用OpenMP功能或未使用特殊指令集)
优点:

  • 它可以快速下载,因为包很可能缓存在您的计算机附近
  • 它可以快速安装(这些包是预构建的,不涉及编译)
  • 它只是起作用
因此,我希望您可以在这些机器上使用aptitude或rpm或其他任何东西,并在幕后继承分发包维护人员为您所做的伟大工作

一旦您对应用程序充满信心并发现了一些瓶颈或问题,您就有理由使用更新版本的numpy/matplotlib/。。。或者,通过创建优化的构建,您可能有理由拥有更快的版本

编辑:概述方法的EB相关详细信息 同时,我们了解到,默认情况下,EB是基于Red Hat Enterprise Linux运行的。同样,它使用
yum
作为包管理器,包采用RPM格式

Amazon提供了关于可用软件包的文档。在Amazon Linux 2014.09中,提供了以下软件包:

在这个列表中,我们可以找到

  • numpy-1.7.2
  • python-matplotlib-0.99.1.2
根据2009年9月发布的“2009-09-21标记为0.99.1版”,matplotlib的这个版本非常古老

我没料到它会这么旧,但它可能足够满足你的需要了。因此,我们继续我们的计划(但如果这是一个拦路虎,我会理解)

现在,我们知道系统Python和EB Python是相互隔离的。这并不意味着EB-Python无法访问系统Python站点包。我们只需要它告诉我们。一种简单而干净的方法是使用EB-Python应该可以访问的包设置适当的目录结构,并通过
sys.path
将该目录与EB-Python通信

显然,我们需要定制EB容器的引导阶段。此处记录了可用的工具:

显然,我们希望使用
软件包
方法,并告诉EB通过yum安装
numpy
python matplotlib
软件包。因此,相应的配置文件部分应包含:

 packages:  
  yum:  
   numpy: []  
   python-matplotlib: []  
可能没有必要明确提到
numpy
,这可能是python matplotlib的一个依赖项

此外,我们还需要使用
命令
部分:

您可以使用commands键在EC2实例上执行命令。 命令按名称的字母顺序进行处理,并运行 在设置应用程序和web服务器之前 提取版本文件

以下三个命令创建上述目录,并设置指向numpy/mpl instal的符号链接
 packages:  
  yum:  
   numpy: []  
   python-matplotlib: []  
commands:
  00-create-dir:
    command: "mkdir -p /opt/py26-selected-site-packages"
  01-link-numpy:
    command: "ln -s /usr/lib64/python2.6/site-packages/numpy /opt/py26-selected-site-packages/numpy"
  02-link-mpl:
    command: "ln -s /usr/lib64/python2.6/site-packages/matplotlib /opt/py26-selected-site-packages/matplotlib"
sys.path.append("/opt/py26-selected-site-packages")
from matplotlib import pyplot
sys.path.insert(0, "/opt/py26-selected-site-packages")
[ec2-user@ip-1-1-1-174 ~]$ yum list | grep matplot
python-matplotlib.x86_64            0.99.1.2-1.6.amzn1              amzn-main
packages:
  yum:
    python-matplotlib: [] 
    python-devel: []
    atlas-sse3-devel: []
    lapack-devel: []
    libpng-devel: []
    freetype-devel: []
    zlib-devel: []
sudo docker pull chuseuiti/pynuscimat2.7
sudo docker pull chuseuiti/pynusci
sudo docker login
 sudo docker run -i -t chuseuiti/pynuscimat2.7 bash