我必须处理在 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: []
正如你所看到的,我显式安装了一些 python 库,如 numpy、matplotlib 和 psycopg2,但由于我的应用程序似乎在虚拟环境中运行,这些库对于我的应用程序来说是无法访问的,因此在启动时会崩溃。我遇到了此类错误:
Command failed on instance. Return code: 1 Output: (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. For more detail, check /var/log/eb-activity.log using console or EB CLI.
我读到,您可以使用 system-site-packages 选项允许虚拟环境访问系统库,但如何对 AWS elastic beanstalk 实例执行此操作?
编辑:我不想做的是使用 pip 安装 numpy、matplotlib 和 psycopg2,因为它会编译所有内容,而且非常长。这就是为什么我想用 yum 安装这些库,以获得预编译版本。我希望这些安装是自动的,我不想在机器上通过 ssh 手动安装。这就是我的问题出现的地方。 :)
非常感谢您的宝贵时间!
(抱歉我的英语,这不是我的母语)
最佳答案
长话短说:
将以下命令添加到 .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"
这应该将 /usr/lib64/python2.7/dist-packages
下的库(例如 yum 安装 numpy 和 scipy...)暴露给 EB 的 virtualenv 使用的解释器。
Elastic Beanstalk 正在使用 /opt/python/run/venv/bin/pip install -rrequirements.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',
]
因此,将包含所需库路径的 .pth
文件添加到列出的文件夹之一就足够了(请参阅 here )。这可以按照开头提到的那样完成。请注意,您需要 requirements.txt
来保存 Python 软件包以及使用 yum 安装的软件包的确切版本,以便跳过不必要的安装步骤。
关于django - 如何在 AWS Elastic Beanstalk 上使用 virtualenv system-site-packages?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36653523/