oro*_*ome 7 numpy pip matplotlib amazon-web-services amazon-elastic-beanstalk
我正忙着在AWS Elastic Beanstalk上部署matplotlib. 我认为我的问题来自一些依赖关系以及EB部署使用PIP安装的软件包的方式,并试图按照SO上的说明解决问题.
我首先尝试逐步部署,如链接的答案所示,通过添加matplotlib包堆栈到我的 requirements.txt各个部分分阶段文件中.但这需要永远(对于每个阶段)并且容易出现故障和超时(这似乎留下了后续软件包安装后面的构建目录).
因此,在答案结束时提到的简单解决方案对我eb ssh很有吸引力:只需激活virtialenv
source /opt/python/run/venv/bin/activate
Run Code Online (Sandbox Code Playgroud)
并pip install手动打包.但我也无法让这个工作.首先,我经常遇到left-beind构建目录(如上所述)
pip can't proceed with requirement 'xxxx' due to a pre-existing build directory.
location: /opt/python/run/venv/build/xxxx
This is likely due to a previous installation that failed.
pip is being responsible and not assuming it can delete this.
Please delete it and try again.
Run Code Online (Sandbox Code Playgroud)
但即使在删除这些之后,我也会一直得到
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'
Run Code Online (Sandbox Code Playgroud)
回应pip install xxxx(并sudo pip失败sudo: pip: command not found).
我可以做些什么来使用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: []
Run Code Online (Sandbox Code Playgroud)
并以a 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
Run Code Online (Sandbox Code Playgroud)
大约4个小时之后,我已经达到了numpy(如pip listEB virtualenv 报道的那样).
并且(如果它很重要)正在进行SSH连接的用户属于具有该策略的组
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"elasticbeanstalk:*",
"ec2:*",
"elasticloadbalancing:*",
"autoscaling:*",
"cloudwatch:*",
"s3:*",
"sns:*",
"cloudformation:*",
"rds:*",
"sqs:*",
"iam:PassRole"
],
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我在Windows和Linux系统上使用了很多方法来构建和部署numpy/scipy/matplotlib.我使用过系统提供的软件包管理器(aptitude,rpm),第三方软件包管理器(pypm),Python软件包管理器(easy_install,pip),源代码发布,使用不同的构建环境/工具(GCC,还有英特尔MKL,OpenMP) ).在这样做的同时,我遇到了许多非常烦人的情况,但也学到了很多关于每种方法的利弊.
我没有Elastic Beanstalk(EB)的经验,但我有EC2的经验.我看到你可以通过SSH连接到一个实例并进行搜索.所以,我在下面进一步建议是基于
我的建议:从不自己建造这些东西开始.不要使用pip.如果可能的话,尝试使用Linux发行版的软件包管理器,让它通过一个命令(例如)处理所需的一切安装sudo apt-get install python-matplotlib.
缺点:
好处:
因此,我希望您可以在这些机器上使用aptitude或rpm或其他任何东西,并继承分发包维护人员在幕后为您做的出色工作.
一旦您对应用程序有信心并发现了一些瓶颈或问题,您可能有理由使用较新版本的numpy/matplotlib/...或者您可能有理由通过创建优化版本来获得更快版本的版本.
与此同时,我们了解到EB默认运行基于Red Hat Enterprise Linux的Amazon Linux.同样,它yum用作包管理器,包是RPM格式.
亚马逊提供有关可用包的文档.在Amazon Linux 2014.09中,可以使用以下软件包:http://aws.amazon.com/de/amazon-linux-ami/2014.09-packages/
在这个列表中我们发现
根据2009年9月的更新日志,这个版本的matplotlib已经很老了:"2009-09-21标记为0.99.1版".
我没想到它会如此陈旧,但仍然可能足以满足您的需求.所以我们继续我们的计划(但我知道这是否是一个阻止者).
现在,我们已经了解到系统Python和EB Python是相互隔离的.这并不意味着EB Python无法访问系统Python站点包.我们只是需要这样说.一个简单而干净的方法是使用EB Python可以访问的包建立一个正确的目录结构,并通过这个目录与EB Python进行通信sys.path.
显然,我们需要定制EB容器的自举阶段.可用的工具在此处记录:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
显然,我们想要使用这种packages方法,并告诉EB 通过yum 安装numpy和python-matplotlib包.所以相应的配置文件部分应该包含:
packages:
yum:
numpy: []
python-matplotlib: []
Run Code Online (Sandbox Code Playgroud)
numpy可能没有必要明确提及,它可能是python-matplotlib的依赖.
另外,我们需要使用以下commands部分:
您可以使用命令键在EC2实例上执行命令.命令按名称按字母顺序处理,并在设置应用程序和Web服务器并提取应用程序版本文件之前运行.
以下三个命令创建上述目录,并设置指向numpy/mpl安装路径的符号链接(希望这些路径在执行这些命令时可用):
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"
Run Code Online (Sandbox Code Playgroud)
两个不确定因素:AWS文档不澄清packages在commands执行之前处理的文档.你得试试.它不起作用,使用container_commands.其次,/usr/lib64/python2.6/site-packages/matplotlib在安装python-matplotlib之后,它只是一个有根据的猜测.它应该安装到这个地方,但它可能会在其他地方结束.需要测试.其中指定为推断numpy的应该结束了这个文章.
[SEB更新] AWS文档说"cfn-init帮助程序脚本按以下顺序处理这些配置部分:包,组,用户,源,文件,命令,然后是服务." http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-init.html
所以,你的方法是安全的[/ UPDATE]
正如本答案的评论中所指出的,关键步骤是告诉您的Python应用程序在哪里查找包.sys.path 在尝试导入之前直接修改是控制此操作的可靠方法.以下代码将我们的特殊目录添加到Python查找包的目录选择中,然后尝试导入matplotlib:
sys.path.append("/opt/py26-selected-site-packages")
from matplotlib import pyplot
Run Code Online (Sandbox Code Playgroud)
顺序sys.path定义了优先级,所以如果在其他目录中有任何其他matplotlib或numpy包可用,那么它可能是一个更好的主意
sys.path.insert(0, "/opt/py26-selected-site-packages")
Run Code Online (Sandbox Code Playgroud)
但是,如果我们的整个方法经过深思熟虑,这不应该是必要的.
| 归档时间: |
|
| 查看次数: |
3437 次 |
| 最近记录: |