django - 如何在 AWS Elastic Beanstalk 上使用 virtualenv system-site-packages?

标签 django python-2.7 amazon-web-services amazon-ec2 virtualenv

我必须处理在 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/

相关文章:

python - 如何以编程方式获取上次迁移的名称?

python - (找不到)python 可数属性 most_common()

linux - 如何在 python 2.7 中使用 ctypes 返回指针字符串

postgresql - psycopg2 cursor.execute() 传入变量表名和项

amazon-web-services - CloudWatch 统一代理 : Additional property append_dimensions is not allowed

django - 无法将aws RDS连接到django本地

django - 使用 Apache WSGI 通过 DJANGO_SETTINGS_MODULE 环境变量设置 Django 设置文件

javascript - 以具有javascript代码的Django形式发送输入名称

amazon-web-services - 我是否需要每天为 AWS Dynamo DB 设置备份数据管道?

django - 运行 django 的最佳系统是什么?