在 OS 12.3+ 的新 macbook pro M1 上使用 pyenv 安装 python 3.7.6 时出错

Error installing python 3.7.6 using pyenv on new macbook pro M1 in OS 12.3+

我正在努力在 mac os 12.3 上的新 macbook pro M1 运行 上使用 pyenv 安装 python 版本 3.7.6。 1.

我的配置

$ clang -v
Apple clang version 13.1.6 (clang-1316.0.21.2)
Target: arm64-apple-darwin21.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ pyenv install 3.7.6

python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.6.tar.xz...
-> https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz
Installing Python-3.7.6...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 12.3.1 using python-build 2.2.5-10-g58427b9a)

Inspect or clean up the working tree at /var/folders/4t/1qfwng092qz2qxwxm6ss2f1c0000gp/T/python-build.20220405170233.32567
Results logged to /var/folders/4t/1qfwng092qz2qxwxm6ss2f1c0000gp/T/python-build.20220405170233.32567.log

Last 10 log lines:
checking for --with-cxx-main=<compiler>... no
checking for clang++... no
configure:

  By default, distutils will build C++ extension modules with "clang++".
  If this is not intended, then set CXX on the configure command line.

checking for the platform triplet based on compiler characteristics... darwin
configure: error: internal configure error for the platform triplet, please file a bug report

最后,这个补丁可以使用 pyenv 在 macbook m1 上安装 3.7.6。

要使用 pyenv 在 mac os 12+、M1 芯片、apple clang 版本 13+ 中安装 python 3.7.6 版本,请在本地任意位置创建一个文件并调用它 python-3.7.6-m1.patch 并将内容(以下)复制到该文件并保存。

diff --git a/configure b/configure
index b769d59629..8b018b6fe8 100755
--- a/configure
+++ b/configure
@@ -3370,7 +3370,7 @@ $as_echo "#define _BSD_SOURCE 1" >>confdefs.h
   # has no effect, don't bother defining them
   Darwin/[6789].*)
     define_xopen_source=no;;
-  Darwin/1[0-9].*)
+  Darwin/[12][0-9].*)
     define_xopen_source=no;;
   # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but
   # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined
@@ -5179,8 +5179,6 @@ $as_echo "$as_me:
 fi
 
 
-MULTIARCH=$($CC --print-multiarch 2>/dev/null)
-
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5
 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; }
@@ -5338,6 +5336,11 @@ $as_echo "none" >&6; }
 fi
 rm -f conftest.c conftest.out
 
+if test x$PLATFORM_TRIPLET != xdarwin; then
+  MULTIARCH=$($CC --print-multiarch 2>/dev/null)
+fi
+
+
 if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then
   if test x$PLATFORM_TRIPLET != x$MULTIARCH; then
     as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5
@@ -9247,6 +9250,9 @@ fi
      ppc)
        MACOSX_DEFAULT_ARCH="ppc64"
        ;;
+     arm64)
+        MACOSX_DEFAULT_ARCH="arm64"
+       ;;
      *)
        as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5
        ;;
diff --git a/configure.ac b/configure.ac
index 49acff3136..2f66184b26 100644
--- a/configure.ac
+++ b/configure.ac
@@ -490,7 +490,7 @@ case $ac_sys_system/$ac_sys_release in
   # has no effect, don't bother defining them
   Darwin/@<:@6789@:>@.*)
     define_xopen_source=no;;
-  Darwin/1@<:@0-9@:>@.*)
+  Darwin/@<:@[12]@:>@@<:@0-9@:>@.*)
     define_xopen_source=no;;
   # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but
   # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined
@@ -724,8 +724,7 @@ then
 fi
 
 
-MULTIARCH=$($CC --print-multiarch 2>/dev/null)
-AC_SUBST(MULTIARCH)
+
 
 AC_MSG_CHECKING([for the platform triplet based on compiler characteristics])
 cat >> conftest.c <<EOF
@@ -880,6 +879,11 @@ else
 fi
 rm -f conftest.c conftest.out
 
+if test x$PLATFORM_TRIPLET != xdarwin; then
+  MULTIARCH=$($CC --print-multiarch 2>/dev/null)
+fi
+AC_SUBST(MULTIARCH)
+
 if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then
   if test x$PLATFORM_TRIPLET != x$MULTIARCH; then
     AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report])

现在我们可以使用 pyenv 安装 python 3.7.6,如下所示(需要与我们刚刚创建的补丁文件位于同一目录):

pyenv install --patch 3.7.6 < python-3.7.6-m1.patch

要在 mac os 12+ 上安装其他 python 版本,M1 芯片,apple clang 版本 13+ 使用 pyenv(未测试但应该可以)

浅克隆您有兴趣安装的 python 版本的分支。转到 https://github.com/python/cpython 并在“标签”下拉列表中找到可用于克隆的版本

git clone https://github.com/python/cpython --branch v3.x.x --single-branch
cd cpython

现在更改其中的两个文件(configure.ac 和配置)。 git diff 应该如上所示。根据您安装的 python 版本,行号会有所不同,此 git diff 文件适用于 3.7.6,不能直接用于其他版本。对于 python 的其他版本,在上述 git 差异中显示的确切文件中搜索确切的代码行 edited/deleted 并进行相应的更改。然后将 git diff 保存在一个新文件中,如下所示。

git diff > python-3.x.x-m1.patch

现在我们可以使用以下方法安装该版本:

pyenv install --patch 3.x.x < python-3.x.x-m1.patch