Myx*_*Myx 5 django amazon-ec2 virtualenv amazon-web-services python-2.7
我必须处理在 AWS Elastic Beanstalk 上运行的现有 python (django) 应用程序。似乎所有要求(来自 requirements.txt)都安装在虚拟环境中(我希望我是对的)。我的问题是我使用 yum 安装了一些库。我的 beanstalk 实例的依赖项配置如下所示:
packages:
yum:
python27-devel: []
git: []
nginx: []
pcre-devel: []
freetype-devel: []
libpng-devel: []
postgresql93-devel: []
graphviz-devel: []
blas-devel: []
atlas-devel: []
lapack-devel: []
gcc-c++: []
python27-numpy: []
python27-matplotlib: []
python27-psycopg2: []
Run Code Online (Sandbox Code Playgroud)
如您所见,我显式安装了一些 python 库,如 numpy、matplotlib 和 psycopg2,但由于我的应用程序似乎在虚拟环境中运行,因此我的应用程序无法访问这些库,因此它在启动时崩溃。我得到了这种类型的错误:
命令在实例上失败。返回代码:1 输出:(TRUNCATED)....7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 20, in raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e ) django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named psycopg2. container_command 01_migrate in .ebextensions/02-python.config failed. 有关更多详细信息,请使用控制台检查 /var/log/eb-activity.log 或EB CLI。
我读过您可以允许虚拟环境使用选项 system-site-packages 访问系统库,但如何为 AWS 弹性 beantalk 实例执行此操作?
编辑:我不想做的是用 pip 安装 numpy、matplotlib 和 psycopg2,因为它编译了所有东西,而且很长。这就是为什么我想用 yum 安装这些库,以获得预编译版本。而且我希望这些安装是自动的,我不想在机器上通过 ssh 手动安装东西。这就是我的问题出现的地方。:)
非常感谢您的时间!
(对不起,我的英语不是我的母语)
TL;DR:将以下命令添加到.ebextensions文件夹下的配置文件中:
commands:
01_add_dist_files_to_site:
command: "echo /usr/lib64/python2.7/dist-packages > /opt/python/run/venv/local/lib64/python2.7/site-packages/dist.pth"
Run Code Online (Sandbox Code Playgroud)
这应该将下面的库/usr/lib64/python2.7/dist-packages(例如 yum 安装 numpy 和 scipy...)暴露给 EB 的 virtualenv 使用的解释器。
Elastic Beanstalk 用于/opt/python/run/venv/bin/pip install -r requirements.txt安装您的需求。您需要以某种方式设置 python virtualenv,使其暴露给已安装的软件包。
检查 EB 的 venv 可以访问的站点库,我发现:
(venv)[root@ip-XXXXXX app]# /opt/python/run/venv/bin/python2.7 -msite
sys.path = [
'',
'',
'/opt/python/run/venv/local/lib64/python2.7/site-packages',
'/opt/python/run/venv/local/lib/python2.7/site-packages',
'/opt/python/run/venv/lib64/python2.7',
'/opt/python/run/venv/lib/python2.7',
'/opt/python/run/venv/lib64/python2.7/site-packages',
'/opt/python/run/venv/lib/python2.7/site-packages',
'/opt/python/run/venv/lib64/python2.7/lib-dynload',
'/usr/lib64/python2.7',
'/usr/lib/python2.7',
]
Run Code Online (Sandbox Code Playgroud)
.pth因此,将包含所需库路径的文件添加到列出的文件夹之一就足够了(请参阅此处)。这可以按照开头提到的那样完成。请注意,您需要requirements.txt保存与使用 yum 安装的 Python 包完全相同的版本,以便跳过不必要的安装步骤。