pip3 install ruamel.yaml[jinja2] 中断 ruamel.yaml

pip3 install ruamel.yaml[jinja2] breaks ruamel.yaml

我有一个 docker 容器,它已经使用 ruamel.yaml 和 ruamel.yaml.jinja2 一段时间了。最近它开始失败了。以下 docker 文件重现了该问题:

FROM ubuntu

RUN apt update; apt install -y python3 python3-pip
RUN pip3 install -U pip setuptools wheel
RUN pip install ruamel.yaml
RUN python3 -c "from ruamel.yaml import YAML"

RUN pip install ruamel.yaml[jinja2]
RUN python3 -c "from ruamel.yaml import YAML"

第一个 python3 命令成功,但最后一个失败并显示以下消息:导入错误:无法导入名称 'YAML'

我尝试指定 ruamel.yaml 的早期版本,但没有成功,除非我一直回到 0.15.0(从 2017 年开始)。

我也尝试了不同版本的 python3.x 和 pip,没有任何变化。

looks like ruamel.yaml.jinja2 was updated to version 0.2.3 four days ago.

我认为版本已损坏,因此暂时手动安装 ruamel.yaml.jinja2 的旧版本:

pip install ruamel.yaml "ruamel.yaml.jinja2<0.2.3"

这似乎也有效。

~ $ docker run -it python:3.7-stretch sh -c 'pip install ruamel.yaml[jinja2]; python3 -c "from ruamel.yaml import YAML"'
Collecting ruamel.yaml[jinja2]
Collecting ruamel.yaml.jinja2>=0.2; extra == "jinja2" (from ruamel.yaml[jinja2])
Successfully installed ruamel.yaml-0.15.97 ruamel.yaml.jinja2-0.2.3
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: cannot import name 'YAML' from 'ruamel.yaml' (/usr/local/lib/python3.7/site-packages/ruamel/yaml/__init__.py)

~ $ docker run -it python:3.7-stretch sh -c 'pip install ruamel.yaml "ruamel.yaml.jinja2<0.2.3"; python3 -c "from ruamel.yaml import YAML"'
Collecting ruamel.yaml
Collecting ruamel.yaml.jinja2<0.2.3
Successfully installed ruamel.yaml-0.15.97 ruamel.yaml.jinja2-0.2.2
~ $

longer-term 修复是使用适当的依赖版本固定系统——我喜欢 pip-tools

正如@AKX 指出的那样,ruamel.yaml.jinja2(当你执行 pip install ruamel.yaml[jinja2] 时安装)已更新以处理 jinja2 评论,并且这个嵌套包包含一个虚假的 .pth 文件,破坏了正确的ruamel.yaml 安装。

PyPI 上有一个新的 0.2.4 版本的 ruamel.yaml.jinja2,我已经能够毫无错误地构建您的 Dockerfile

但一般来说,按照@AKX 的建议,修复您在 Dockerfile 中使用的所有包的版本号是个好主意。