Numpy 如何为我的AWS Elastic Beanstalk应用程序安装matplotlib?
我在AWS Elastic Beanstalk上部署matplotlib的时间很长。我的问题来自于一些依赖关系和EB部署随PIP安装的软件包的方式,并且已经尝试按照解决问题的方法 我首先尝试了增量部署,正如链接答案中所建议的那样,通过将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,用
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