在操作系统12.3+中的新macbook pro M1上使用pyenv安装python 3.7.6时出错



我很难在macos 12.3.1上运行的新macbook pro M1上使用pyenv安装python 3.7.6版本。

我的配置

$ 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在macos12+、M1芯片、appleclang 13+版本中安装python 3.7.6版本,请在本地的任何位置创建一个文件,并将其称为python-3.7-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

使用pyenv在mac os 12+、M1芯片、apple clang 13+版本上安装其他python版本(未测试但应工作(

浅层克隆您感兴趣安装的python版本的分支。转到https://github.com/python/cpython并在";标签";下拉

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

现在对其中的两个文件(config.ac和configure(进行更改。gitdiff应该像上面显示的那样。行号将根据您安装的python版本而有所不同,此git-diff文件适用于3.7.6,不能直接用于其他版本。对于其他版本的python,请在上面的gitdiff中所示的确切文件中搜索正在编辑/删除的确切代码行,并进行相应的更改。然后将gitdiff保存在一个新文件中,如下所示。

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

现在我们可以使用安装该版本

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

如果您没有绑定到特定的补丁(即x.y.z中的z(,以下链接中的摘录可以帮助您:

我可以确认昨天的版本3.7.13、3.8.13、3.9.11和3.10.3在我的英特尔mac上都运行良好。GCC解决方案对我来说并不可行,因为它导致了使用clang构建的pip模块出现问题。我认为我现在不需要3.6或更旧的分支,但我怀疑它们可能需要通过pyenv手动补丁,因为它们是EOL上游。

我个人需要3.8.x版本,并成功地使用了pyenv install 3.8.13

最新更新