AWS Elastic Beanstalk Python (3.8) 平台:除了使用 `requirements.txt` 之外,使用 `--no-deps` 标志为 Python 包运行额外的 pip 命令

问题描述

一个名为 Pythonaiopg 包,用于异步处理 Postgresql 数据库。它有两个依赖项 - async-timeoutpsycopg2-binary。我不希望它在使用 psycopg2-binary 时安装 pip,因为我使用的是常规的 psycopg2 包。这是因为 psycopg2-binary 的作者不建议在生产中使用它。

这一切都不会在本地工作造成任何问题,因为我可以将所需的 aiopg 依赖项添加requirements.txt 中,省去不需要的依赖项,然后运行两个单独的命令:

  1. pip install -r requirements.txt
  2. pip install aiopg --no-deps

但是当我将我的项目推送到 Elastic Beanstalk 时,它使用 requirements.txt 来安装 Python 包,而我不知道如何运行额外的 pip 命令。>

我尝试将 pip3 install aiopg --no-deps 以及此命令的不同变体添加eb.config(同时添加commandscontainer_commands 部分),但无济于事。

现在我的 eb.config 看起来像这样:

packages:
    yum:
        amazon-linux-extras: []

commands:
    01_postgres_activate:
        command: sudo amazon-linux-extras enable postgresql11
    02_postgres_install:
        command: sudo yum install -y postgresql-devel

container_commands:
    01_aiopg_install:
        command: python3 -m pip install aiopg==1.2.1 --no-deps

但这并没有起色。 Beanstalk 环境处于 Severe 状态,而我的 web.stdout.log 仍然包含此错误web: ModuleNotFoundError: No module named 'aiopg'

那么如何使用 pip 标志实现这个额外的 --no-deps 命令,而 requirements.txt 文件中尚不支持该标志?

解决方法

在发布这个问题之前,我花了一整天试图解决这个问题。但是在发布这篇文章后一段时间,我又在谷歌上搜索了一段时间,尝试了其他几种方法并找到了一个可行的解决方案。

我将问题中显示的 eb.config 文件中的最后一行更改为 command: /var/app/venv/.../bin/python -m pip install aiopg==1.2.1 --no-deps,其中 ... 应替换为位于 /var/app/venv/ 中的目录名称Beanstalk 的 EC2 实例。如果您设置了将日志导出到 pip(您将看到您的 {{ 1}} 的环境)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...