pyenv:构建失败(Fedora 34 使用 python-build 20180424)

Mai*_*lii 6 python fedora pyenv

我需要帮助通过 pyenv 安装 python

$ pyenv -v
pyenv 1.2.27
Run Code Online (Sandbox Code Playgroud)

我尝试安装3.6.8版本

$ pyenv install 3.6.8
Run Code Online (Sandbox Code Playgroud)

我收到错误

下载Python-3.6.8.tar.xz... -> https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz安装Python-3.6.8.. ./home/dn121283mvp1/.pyenv/plugins/python-build/bin/python-build:第 1804 行:355307 分段错误(核心已转储)“$PYTHON_BIN”-s -m Ensurepip ${ensurepip_opts} > /dev/null 2 >&1 从https://bootstrap.pypa.io/get-pip.py安装 pip ...。/home/dn121283mvp1/.pyenv/plugins/python-build/bin/python-build:第 1785 行:355338 分段错误(核心转储)“${PYTHON_BIN}”-s“${get_pip}”${GET_PIP_OPTS} 1> &4 2>&1 错误:无法通过 get-pip.py 安装 pip

构建失败(Fedora 34 使用 python-build 20180424)

检查或清理 /tmp/python-build.20210506064823.343245 处的工作树 结果记录到 /tmp/python-build.20210506064823.343245.log

最后 10 行日志: install|*) Ensurepip="" ;; \ 经济和社会委员会;\ ./python -E -m Ensurepip \ $ensurepip --root=/ ; \ fi 查看链接:/tmp/tmp4a3uh2fu 收集 setuptools 收集 pip 安装收集的软件包:setuptools,pip 已成功安装 pip-18.1 setuptools-40.6.2

我需要 3.6.8 版本才能安装

Bri*_*tch 15

您可以向 pyenv 传递补丁来修复此问题。

我在这里发布了一个解决方案https://github.com/pyenv/pyenv/issues/1889#issuecomment-837697366

您需要修补一些 Python 3.6 对象分配代码才能使用 16 字节对齐。看来这个问题已在 Python 3.7 中修复。

在将补丁提供给 pyenv 之前,必须调整补丁以不使用a父目录名称。b

在 Python 3.6.8 上进行测试,因为这就是我所需要的。

$ cat alignment.patch
Run Code Online (Sandbox Code Playgroud)
--- Include/objimpl.h
+++ Include/objimpl.h
@@ -250,7 +250,7 @@
         union _gc_head *gc_prev;
         Py_ssize_t gc_refs;
     } gc;
-    double dummy;  /* force worst-case alignment */
+    long double dummy;  /* force worst-case alignment */
 } PyGC_Head;

 extern PyGC_Head *_PyGC_generation0;
--- Objects/obmalloc.c
+++ Objects/obmalloc.c
@@ -643,8 +643,8 @@
  *
  * You shouldn't change this unless you know what you are doing.
  */
-#define ALIGNMENT               8               /* must be 2^N */
-#define ALIGNMENT_SHIFT         3
+#define ALIGNMENT               16               /* must be 2^N */
+#define ALIGNMENT_SHIFT         4

 /* Return the number of bytes in size class I, as a uint. */
 #define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT)
Run Code Online (Sandbox Code Playgroud)
$ pyenv install --patch 3.6.8 < alignment.patch
Run Code Online (Sandbox Code Playgroud)
Downloading Python-3.6.8.tar.xz...
-> https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
Installing Python-3.6.8...
patching file Include/objimpl.h
Hunk #1 succeeded at 255 (offset 5 lines).
patching file Objects/obmalloc.c
Hunk #1 succeeded at 650 (offset 7 lines).
Installed Python-3.6.8 to /home/asdf/.pyenv/versions/3.6.8
Run Code Online (Sandbox Code Playgroud)