python - 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 实现以及如何防止它尝试构建本机扩展?
解决方案
您正在安装 '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.yaml
usingpip install --no-deps ruamel.yaml
然后它不会尝试检索和编译ruamel.yaml.clib
.
推荐阅读
- javascript - VisualStudioCode 不接受我的 JavaScript 文件
- oracle - 运行使用嵌套表的存储过程时调用中的参数数量或类型错误
- audio - 共享音频android 11
- php - Symfony sqlite 迁移注册添加唯一约束
- web-applications - 使用 ADFS 登录的自定义 Web 应用程序在大约 12 小时后要求用户提供凭据
- node.js - 如何使用 smtp 发送带有缩略图的电子邮件?
- swift - 对循环内的异步块感到困惑
- python - 使用 yield 语句的意外输出
- android-webview - Google Play Store 如何降级 Android Webview?
- django - Django用一个字段反序列化,但用另一个字段序列化