首页 > 解决方案 > ruamel.yaml 在 Ubuntu 容器构建中需要 python-dev

问题描述

我最近应我的 OSS 项目维护者的要求从 pyyaml 切换到 ruamel.yaml。一切正常,直到我为项目的Buildkite Verification 构建提交 PR,该构建使用 tox 使用Ubuntu 18 容器自动化多个 python 版本测试。在使用 Python 3.9 进行的第二次测试(在 Python 3.8 测试成功之后)中,ruamel 突然决定尝试构建 c 扩展,但由于容器中没有 Python-dev 而失败。这是此失败的示例:

https://buildkite.com/uavcan/nunavut-pr/builds/417#80433505-7b0c-4ea5-bdc6-ecf5938fc30d/111-1231

running build_ext
  building '_ruamel_yaml' extension
  creating build/temp.linux-x86_64-3.9
  creating build/temp.linux-x86_64-3.9/ext
  x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/repo/.tox/py39-rstdoctest/include -I/usr/include/python3.9 -c ext/_ruamel_yaml.c -o build/temp.linux-x86_64-3.9/ext/_ruamel_yaml.o
  ext/_ruamel_yaml.c:4:10: fatal error: Python.h: No such file or directory
      4 | #include "Python.h"
        |          ^~~~~~~~~~
  compilation terminated.
  error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1

我们如何强制 ruamel 使用全 python 实现以及如何防止它尝试构建本机扩展?

标签: pythonubuntu-18.04toxruamel.yaml

解决方案


您正在安装 'ruamel.yaml<16.0' 并且对于那个旧版本,从未为 Python 3.9(或 Python 3.8)生成轮子。

最新的 ruamel.yaml 0.15 版本(0.15.100)于 2019 年 7 月发布,2019 年 10 月发布 Python 3.8 的第一个版本,2020 年 10 月发布 Python 3.9 的第一个版本(manylinux,用于linux 轮子,也要更新)。因此从未生成过轮子。

最简单的解决方案是使用更新版本的 ruamel.yaml,没有理由坚持使用旧版本。

ruamel.yaml(从 0.16 IIRC 开始)的较新版本中,C 代码被分解ruamel.yaml.clib(因此我不必为 Python 中的每一次更改生成轮子,以保证新版本的 ruamel.yaml)。如果这样的版本尝试从源代码编译(例如对于 Python 3.10,因为这些轮子不可用),您可以安装ruamel.yamlusingpip install --no-deps ruamel.yaml然后它不会尝试检索和编译ruamel.yaml.clib.


推荐阅读