在 M1 芯片(基于 ARM 的 Apple Silicon)的 Mac 上安装 Python 3.8 之前的早期版本失败。

26

我有一台配备了苹果M1芯片的Macbook,需要使用Python 3.6.5来进行我的项目。它自带Python 2.7.16和3.8.2。我使用了brew来安装Python,但默认安装的是3.9.1。

所以,我尝试使用这个homebrew公式来安装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解释的方法在此处安装python并带有git提交失败,因为它在homebrew中不再受支持。

当我尝试使用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也无法运行(我拥有管理员权限)。

最后发现了这个 Python bug 报告,该报告称将为Python 3.8、3.9和3.10修复漏洞。 显然,旧版本在M1芯片上不会得到官方支持。

我的问题是:

  1. 是否有其他方法可以在Mac M1上使用Python 3.6.5? 我错过什么吗?
  2. 如果没有,请提及。 我会接受那个作为答案。

提前致谢。


我建议现在在Rosetta终端下运行Python。许多库等需要来自Homebrew主要阻止列表的上游。顺便说一句,我成功地在Rosetta 2下通过Homebrew安装了3.7.9(及更高版本)。 - Jason R Stevens CFA
2
我没有检查3.7.9,但是3.6.5也无法在Rosetta 2下运行。我得到了与上面显示的相同的zsh:killed。如果它能在运行在Rosetta 2上的终端中运行,那么IDLE一开始就会正常运行。我之所以这样说,是因为3.6.5 dmg适用于x86 CPU,因此IDLE默认情况下将在Rosetta 2上运行。但是它也无法启动,如上所示。 - Kundan Kumar
(附言:我建议根本不要使用Homebrew;安全模型真的很糟糕——使/usr/local/bin可由用户编写意味着恶意软件无需进行任何特权升级即可将未签名的二进制文件放入您的PATH中;还有许多其他原因可以使用Nix,但其对“守护程序模式”的支持,其中单独的nixbld用户执行所有构建任务,并且/nix/store位置中安装的所有内容都只读取所有非特权用户,这是我非常欣赏的东西。) - Charles Duffy
7个回答

15

我强烈支持不在M1上安装Python 3.6的建议,因为它已经到达了EOL。原因是尽管已成功安装该版本,但安装任何包(如pandas、NumPy、SciPy)的尝试最终都会失败,因为这些包的新版本不与旧版Python兼容,而这些包的旧版本则不适用于m1芯片。 - Gary Bao 鲍昱彤

5

Nix在Rosetta 2下安装可以解决问题。在运行以下命令之前,我甚至没有安装它--请注意,当我请求Python 3.6时,Nix正在下载的消息。

# 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版本,至少从安全角度来看是可行的程度。 - Charles Duffy
2
对于像我这样的初学者,请按照以下步骤操作:1.使用“/usr/sbin/softwareupdate --install-rosetta”安装Rosetta。2.安装Nix:“sh <(curl -L https://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)的临时shell:“nix-shell -p python36”。5.使用它创建虚拟环境,并随时使用它。6.使用pip在虚拟环境中安装软件包。7.将Python解释器指向虚拟环境中的解释器,以供IDE或其他需要使用的地方。 - Kundan Kumar
@KundanKumar,你可以告诉Nix为您安装Python软件包,这样您就不需要使用pip,但是这是一个很好的起点。 :) - Charles Duffy
1
@VarunJoshi,我可能会切换到旧版本的nixpkgs,当时Python 3.5仍然受支持--去年的20.09可能已经足够好了。即使这些旧渠道没有更新,它们仍然存在。请参见nix-channel以控制用于检索软件包定义的渠道集合。 - Charles Duffy
1
@RobertMinasyan,没错,但是你可以随时启用旧的通道,当时Python 3.6还是可用的。二进制文件永远不会消失。 - Charles Duffy
显示剩余2条评论

3
使用@Charles Duffy的答案,您可以在M1上运行旧版本。但是,在M1芯片发布时,Python 3.8之前的版本不会得到官方支持,因为它们不在修复错误的阶段。正如这里所明确说明的那样:
“>是否有计划将PR22855回溯到早于3.9的任何分支? 计划还支持Big Sur和Apple Silicon上的3.8,因为3.8仍处于bugfix模式。没有计划将支持回溯到其发布周期的安全修复阶段中的3.7和3.6。”
python bug跟踪器中。
因此,我认为除非有人自己调整Python,否则无法在M1上运行它们。

1
OP并没有要求它成为M1本地应用。当然,需要一个补丁来获得原生构建,但如果他们满意Rosetta,就不需要补丁。 - Charles Duffy

2

相较于其他回答,我有些晚了,但我也曾经遇到过这个问题。我找到了一种不同的解决方案。

我想使用conda创建一个Python3.6环境,但在我的Mac上(搭载M1芯片)却一直失败。

conda create --name myenv python=3.6
Collecting package metadata (current_repodata.json): done
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: failed
PackagesNotFoundError: The following packages are not available from current channels:
 - python=3.6

最好的选择是使用Python 3.8,即使使用--channel conda-forge也是如此。解决方案是下载另一个版本的conda miniconda3。我选择了“Miniconda3 macOS Intel x86 64-bit pkg”(Intel版本),而不是选择“Miniconda3 macOS Apple M1 64-bit pkg”。这样创建Python 3.6 conda环境就可以顺利运行了。这种方法可以在conda环境中运行旧代码,而不会影响Mac Python版本。希望这对其他人也有所帮助,因为上述解决方案似乎并没有起作用。

1

我能够从源代码安装3.8:

./configure --enable-framework=/Users/MyUName/lib/Frameworks
make && make install

我尝试使用3.7版本,但在编译时出现了错误:

cd Mac && /Applications/Xcode.app/Contents/Developer/usr/bin/make pythonw
gcc  -DPYTHONFRAMEWORK='"Python"' -o pythonw \
        ./Tools/pythonw.c -I.. -I./../Include \
        ../Python.framework/Versions/3.7/Python
./Tools/pythonw.c:125:9: error: "Unknown CPU"
#       error "Unknown CPU"
        ^

我尝试了3.6版,但配置过程中失败了:

checking for g++... no
configure:

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

所以我尝试添加CXX=$(xcode-select -p)/usr/bin/g+,但它并没有进展太多:

checking for the platform triplet based on compiler characteristics... darwin
configure: error: internal configure error for the platform triplet, please file a bug report
< p > Conda 不支持 M1 上的 3.6 和 3.7 版本。< /p >

0

我同意@Fini的建议使用x86-64 miniconda3。这可以安装Python 3.6.13,我需要3.6.15,但3.6.13应该也可以。现在我可以安装所有包。

之前我使用pyenv安装Python并在其虚拟环境中工作。我在安装pandas包时遇到了问题,因为它需要numpy。我已经锁定了我的微服务以使用Python 3.6.15,所以pip install numpy无法安装numpy@1.19.5。现在我刚刚用conda完成了相同的环境设置,可以安装pandasnumpypandas的依赖项而被安装。

希望这对其他人有所帮助!


-1

尽管它已经EOL,但是您可以使用pyenv在Mac M1上安装最终版本3.6.15。


1
不太有帮助。请提供更多关于流程/如何解决OP提到的问题的信息。 - Surya
@RonanOD,你能解释一下你是如何使用pyenv实现这个的吗? - calbear47

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接