在具有 M1 芯片(基于 ARM 的 Apple Silicon)的 Mac 上安装较早版本的 Python(3.8 之前)失败
Posted
技术标签:
【中文标题】在具有 M1 芯片(基于 ARM 的 Apple Silicon)的 Mac 上安装较早版本的 Python(3.8 之前)失败【英文标题】:Installation of earlier versions of Python (prior to 3.8) fails on Mac with M1 Chip (ARM based Apple Silicon) 【发布时间】:2021-04-15 14:31:14 【问题描述】:我有带有 Apple M1 芯片的 Macbook,我的项目必须使用 Python 3.6.5。它预装了 Python 2.7.16 和 3.8.2。我使用brew
安装默认安装3.9.1 的Python。
所以,我尝试this自制公式安装3.6.5,但出现以下错误:
checking for pthread_t... yes
checking size of pthread_t... 8
configure: error: Unexpected output of 'arch' on OSX
Do not report this issue to Homebrew/brew or Homebrew/core!
我尝试了 pyenv install 3.6.5
,但失败并出现与上述类似的错误。 ePi272314 解释 here 使用 git commit 安装 python 的方法失败,因为自制软件不再支持它。
当我尝试使用Rosetta 2 运行终端并安装 python 3.6.5 时,使用上述方法,我得到以下或其他一些编译错误:
Error: Cannot install in Homebrew under Rosetta 2 in ARM default prefix (/opt/homebrew)!
最后,我下载了 Python 3.6.5 的 dmg 文件并安装了它。它安装得很好,它在/usr/local/bin/python3
上作为python3 安装可见,但它无法运行。
kxxxr@Kxxxns-MBP bin % where python3
/opt/homebrew/bin/python3
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
/opt/homebrew/bin/python3
/usr/local/bin/python3
/usr/bin/python3
kxxxr@Kxxxns-MBP bin % /opt/homebrew/bin/python3 --version
Python 3.9.1
kxxxr@Kxxxns-MBP bin % /usr/local/bin/python3 --version
zsh: killed /usr/local/bin/python3 --version
kxxxr@Kxxxns-MBP bin %
Python dmg 文件安装的 Idle 也无法运行(我有管理员权限)。
最后遇到了this python 错误报告,该报告说正在修复 Python 3.8、3.9 和 3.10 的错误。显然,M1 芯片官方似乎不支持旧版本。
我的问题是:
-
还有其他方法可以在 Mac M1 上使用 Python 3.6.5 吗?我错过了什么吗?
如果没有,请提及。我会接受这个答案。
提前致谢。
【问题讨论】:
我建议现在在 Rosetta 终端下运行 python。许多库/等需要来自Homebrew major blockers list 的上游。 FWIW 我设法在 Rosetta 2 下通过 Homebrew 安装了 3.7.9(及更高版本)。 我没有检查 3.7.9,但 3.6.5 也没有在 Rosetta 2 下运行。我得到了相同的 zsh:killed ,如上所示。如果它在 Rosetta 2 上运行的终端中运行,那么 IDLE 将首先正常运行。我这样说是因为 3.6.5 dmg 适用于 x86 CPU,因此默认情况下 IDLE 将在 Rosetta 2 上运行。但它也无法如图所示启动。 (旁白:我建议完全不要使用 Homebrew;安全模型真的很糟糕——使/usr/local/bin
用户可写意味着恶意软件不需要进行任何类型的权限提升即可将未签名的二进制文件放入您的 PATH;使用 Nix 的原因还有很多,但它支持“守护程序模式”,其中一个单独的 nixbld 用户执行所有构建任务,并且所有安装的 /nix/store
位置对所有人都是只读的非特权用户,我真的很感激)。
【参考方案1】:
虽然是EOL,但您可以使用 pyenv 在 Mac M1 上安装最终版本 3.6.15。
【讨论】:
【参考方案2】:M1 不支持 Python 3.6 可能是因为 3.6 将在今年年底(2021 年)达到行尾 (EOL)。
我建议您在 M1 上至少尝试 Python 3.7 或更高版本。使用pyenv
,我已经在macOS 11(Apple Silicon)上成功安装了Python 3.7.10
、3.8.6
和3.9.4
。如果您仍在寻找答案,本文将为您提供帮助:https://squademy.medium.com/install-python-on-macos-11-m1-apple-silicon-using-pyenv-12e0729427a9
【讨论】:
【参考方案3】:使用@Charles Duffy 的回答,您可以让旧版本在 M1 上运行。 但是,M1 不会正式支持 3.8 之前的 Python 版本,因为在 M1 芯片发布时它们还没有处于错误修复阶段。明确说明here为:
">是否有计划将 PR 22855 向后移植到任何早于 3.9 的分支?
计划还支持 Big Sur 和 Apple Silicon 上的 3.8,因为 3.8 仍处于错误修复模式。没有计划将支持向后移植到 3.7 和 3.6,它们处于其发布周期的仅安全修复阶段。”
在thispython 错误跟踪器中。
所以我认为没有任何方法可以让他们在 M1 上工作,除非有人自己调整 python。
【讨论】:
OP 并没有要求它是 M1 原生的。当然,获得原生构建需要补丁,但如果他们对 Rosetta 感到满意,则不需要补丁。【参考方案4】:Nix 安装在 Rosetta 2 下就可以了。在运行以下命令之前,我什至没有安装它——请注意在我请求时显示 Nix 正在下载 Python 3.6 的消息。
# yes, this really is a M1 Mac
charles@macbook-pro ~ % uname -a
Darwin macbook-pro.lan 20.2.0 Darwin Kernel Version 20.2.0: Wed Dec 2 20:40:21 PST 2020; root:xnu-7195.60.75~1/RELEASE_ARM64_T8101 x86_64 i386 MacBookPro17,1 Darwin
charles@macbook-pro ~ % arch
arm64
# ...however, Rosetta was used to install an x86_64 Nix build
charles@macbook-pro ~ % file "$(realpath "$(command -v nix)")"
/nix/store/104sp9zrhmh3jycj32jcyl3f13mysdki-nix-2.3.9/bin/nix: Mach-O 64-bit executable x86_64
# ...and that x86_64 Nix build can install and run an x86_64 Python 3.6
charles@macbook-pro ~ % nix run nixpkgs.python36 -c python
[1 copied (53.7 MiB), 9.3 MiB DL]
Python 3.6.12 (default, Dec 18 2020, 15:32:50)
[GCC 4.2.1 Compatible Clang 7.1.0 (tags/RELEASE_710/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
以上内容(出于重现性目的)是使用nixpkgs
收集的,指的是频道https://nixos.org/channels/nixpkgs-20.09-darwin,特别是实例sn5ycj9wkbdmyinvqyg9rn42sw71wqad-nixpkgs-20.09pre245572.f18fbc33930
。
【讨论】:
...也就是说,nixpkgs 20.09 对 Python 3.6 的支持有所下降,因为 NixOS 目前默认使用 3.8——它们不会为 lxml 或 scipy 等流行包缓存二进制文件不再;如果我需要在项目中使用 Python 3.6,我可能会考虑为其固定一个较旧的 nixpkgs 版本,至少从安全角度来看是可行的。 对于像我这样的初学者,请遵循以下步骤: 1. 使用 "/usr/sbin/softwareupdate --install-rosetta" 安装rosetta 2. 安装 nix "sh nixos.org/nix/install) - -darwin-use-unencrypted-nix-store-volume" 3.在主目录中创建一个文件 .zprofile 并添加这一行 "source ~/.nix-profile/etc/profile.d/nix.sh" 以便能够使用终端访问 nix。 4.获取温度。 python的外壳(例如3.6)“nix-shell -p python36”。 5.用它来创建虚拟环境。并随时使用 6. 使用 pip 在虚拟环境中安装软件包。 7.将python解释器指向IDE的虚拟环境或任何需要的地方。 @KundanKumar, ...可以告诉 Nix 为您安装 Python 包,因此您不需要使用pip
,但这是一个很好的起点。 :)
@VarunJoshi,当仍然支持 Python 3.5 时,我可能会从后面切换到较旧的 nixpkgs——去年的 20.09 可能已经足够好了。旧频道仍然存在,即使他们没有获得更新。请参阅nix-channel
以控制用于检索包定义的通道集。
@RobertMinasyan,对,但是当 Python 3.6 可用时,您始终可以从后面启用旧频道。二进制文件永远不会消失。以上是关于在具有 M1 芯片(基于 ARM 的 Apple Silicon)的 Mac 上安装较早版本的 Python(3.8 之前)失败的主要内容,如果未能解决你的问题,请参考以下文章
Apple M1 - macosx-arm64 尚不可用的 Maven Java 依赖项
苹果芯片(M1/Apple Chip)通过UTM安装x86架构虚拟机指南/性能测试(以ubuntu18.04为例)
MacOS(M1芯片 arm架构)下如何安装tensorflow
Xcode 12 Apple M1 arm64 - 可设计错误:“错误的架构”