在Amazon Elastic Beanstalk上安装Anaconda
我在我的Elastic Beanstalk部署中添加了部署命令,这些命令会下载Anaconda安装程序,并把它安装到/anaconda
目录下。一切都很顺利,但我似乎无法正确修改我的实例的PATH,以便包含/anaconda/bin
,就像Anaconda安装页面建议的那样。如果我通过SSH登录到实例并手动添加它,一切都能正常工作。但这显然不是正确的方法,因为机器会被EB自动添加。
所以我的问题是:我该如何在我的脚本中使用Anaconda?
再补充一些细节:
- 我尝试过用各种方法将
/anaconda/bin
添加到系统的PATH中,比如在部署前后脚本中、设置自定义环境变量等等。似乎无论我怎么做,这些修改在应用程序运行时都不会保留。 - 我还尝试通过将Anaconda添加到sys.path来包含它:
sys.path.append('/anaconda/bin')
但没有成功。使用sys.path.append('/anaconda/lib/python2.7/site-packages')
可以让我导入一些包,但在import pandas
时却失败了。奇怪的是,如果我通过SSH登录到实例并用他们的python(/opt/python/run/venv/bin/python2.7
)运行应用程序,它就能正常工作。我是不是疯了?为什么在通过EB运行时,特定的导入语句会失败?
1 个回答
找到了解决办法:import pandas
失败是因为 matplotlib
初始化失败,而它在尝试获取当前用户的主目录。由于这个应用是通过 WSGI 运行的,HOME 变量被设置为 /home/wsgi
但这个目录并不存在。所以,通过部署命令创建这个目录就解决了这个问题。
我在 Elastic Beanstalk 上使用 Anaconda 的整体设置如下:
.ebextensions/options.config
文件包含:
commands:
00_download_conda:
command: 'wget http://repo.continuum.io/archive/Anaconda-2.0.1-Linux-x86_64.sh'
test: test ! -d /anaconda
01_install_conda:
command: 'bash Anaconda-2.0.1-Linux-x86_64.sh -b -f -p /anaconda'
test: test ! -d /anaconda
02_create_home:
command: 'mkdir -p /home/wsgi'
00_download_conda
这个命令只是用来下载 Anaconda。想要获取最新的 Anaconda 版本下载链接,可以查看 这里。test
命令是 Elastic Beanstalk 的一种方式,只有在测试失败时才执行命令……这只是为了在开发时防止重复下载。
01_install_conda
用来安装 Anaconda,选项 -b -f -p /anaconda
让它可以安装到指定目录,不需要用户输入,并且如果已经安装过就跳过安装。
02_create_home
用来创建缺失的目录。
最后,要在你的 Python 应用中使用 Anaconda:sys.path.append('/anaconda/lib/python2.7/site-packages')
干杯!