M1安装python3的最佳实践
第一节:先验知识
1.1:内置python环境
一直以来,macOS 系统都有内置 python 环境的,只不过内置的都是 python2,因此在老版本的 macOS 终端中可以直接运行 python!但是从 macOS12.3 开始,macOS 系统就移除了内置的 python!
旧版本的 macOS 中,在/System/Library/Frameworks
下面有一个名为Python.framework
的文件夹,这个文件夹内安装的就是 python2,但是从 12.3 开始,这个文件夹被移除了,相应的内置 python 环境也不复存在!
如今,即使在新版本的 macOS 中,在/usr/bin
下面仍然有一个名为python3
的可执行文件:
这个文件在所有版本的 macOS 系统中都存在,只是默认情况下是没有用的,即使/usr/bin
目录在环境变量中,但是在执行 python3 命令时仍然会提示你当前系统没有 python 环境:
需要注意的是:若你安装了命令行工具——Command Line Tools,那么/usr/bin/python3
就会“变得可用”,它会指向 CLT 内置的 python3!当我们安装完 CLT 后,在终端中:
所以,没安装命令行工具时,新版本的 macOS 中是没有 python 环境的,不管是 python2 还是python3;但一旦安装了命令行工具后,macOS 自带的 /usr/bin/python3
就会变得可用!
1.2:CLT中的python
那么安装 CLT 后,python3 被安装到哪里去了呢?其实它被安装到如下的位置了:
至于为什么安装命令行工具后,/usr/bin/python3
会指向这里,那就是 macOS 底层的处理了,没必要关心!
1.3:放弃内置python
即然命令行工具中内置了 python3,那么安装完命令行工具后,我们还有必要去自己安装 python3 吗?答案是:肯定有必要!为什么这么说呢,我个人认为主要有如下两个原因。
第一:命令行工具自带的 python3 是简化版的,版本较低,而且不会附带官方文档和 IDLE 等;而自己安装的话,不仅可以自由选择版本,而且还可以附带文档和 IDLE 等。
第二:使用命令行工具自带的python3
可能会出现意料之外的问题。比如pip3
的更新问题,直接更新的话,会在用户目录下生成site-packages
文件夹,这样一来系统中就有了两个site-packages
文件夹了;假如绕开权限(使用sudo
前缀)来更新的话,虽然可以卸载旧版本的pip3
,但是在安装新的pip3
时,会在/Library
中产生名为Python
的文件夹,并在其中继续生成site-packages
文件夹,并没有将新的site-packages
文件夹放到旧版site-packages
的位置,此外还会在/usr/local/bin
中生成pip3
和pip
。虽然都不影响使用,但这无形之中在系统中添加了好多零零散散的目录,看起来很烦!假如后面产生和依赖相关的问题,势必会对定位问题产生不必要的困扰。
综合以上两点,我最终放弃了命令行内置的 python3,在我日常的开发中,我选择使用自己安装的 python3!友情提示:假如你将命令行内置的 python3 作为基础环境,每次都是使用它来创建虚拟环境,然后在项目中继续使用的是你创建的虚拟环境,那命令行工具中内置的 python3 还是可以用的!
第二节:下载安装
2.1:版本选择
虽然 Python 官网说 3.9.1 已经原生支持 M 系列的芯片了,但我从官方下载了 3.9.1,在安装的过程中还是会提示我安装转译器 Rosetta!并且从 3.9.1 开始逐个地尝试,直到 3.9.10 开始(包括 3.9.10),在安装的过程中才不会提示我安装转译器!所以干脆我就选择了 3.9 的最后一个带有.pkg
安装程序的版本——3.9.13!
登陆官网,找到 3.9.13 的下载链接,选择合适的版本来下载:
下载下来的是一个.pkg
格式的安装程序!
2.2:安装步骤
双击安装包,进行傻瓜式安装即可!需要注意的是,安装过程中有个“自定”的选择,不要取消勾选,使用标准安装即可:
安装完成以后,点击安装程序的“关闭”按钮,会自动跳出如下页面:
这说明:安装程序会在/Application
下面生成一个名为“Python 3.9”的文件夹,文件夹中的内容如上图所示!
2.3:验证结果
在安装之前是这样的:
而在安装之后是这样的:
可见,此时我们系统默认的 python3 是我们手动安装的 3.9.13,而不是之前系统默认的 3.9.6(CLT 中内置的)!这就说明我们的安装是成功的!安装的位置就是/library/Frameworks/Python.framework
目录!
2.4:安装位置
通过在终端中执行which python3
命令,我们可以看到安装的python位置:
假如要卸载的话,首先要删除的就是/Library/Frameworks/Python.framework
文件!
2.5:环境变量
使用安装程序来安装的 python3,是不需要配置环境变量的!为什么呢?
打开用户目录下的.zprofile
文件,可见:
假如你用户目录下原本没有这个文件,安装完以后也会自动生成这个文件并将上图红框内的内容写入!这个内容的意思就是把用户安装的 python 命令放到系统 PATH 变量的最前面:
那/Library/Frameworks/Python.framework/Versions/3.9/bin
中都有哪些命令呢?如下:
所以此时我们不需要配置环境变量,因为位于/Library/Frameworks/Python.framework/Versions/3.9/bin
中的这些命令已经被放到系统 PATH 变量的最前面了!
2.6:符号连接
安装程序还会在/usr/local/bin
目录下创建一些符号链接,这些链接指向安装的命令:
而/Library/Frameworks/Python.framework/Versions/3.9/bin
中安装的这些命令原本就已经在系统的 PATH 中了,而且/usr/local/bin
还在/usr/bin
(命令行内置 python3 命令所在位置)的前面,再一次保证了我们不需要自己配置环境变量!
第三节:更新 pip3
3.1:系统中的pip3
不管是通过命令行工具安装的还是我们自己通过安装程序安装的 python3,都会自带 pip3:
显然,当前系统默认的 pip3 是我们自己安装的 python3 中的!
注意:跟 python 一样,在终端中使用 pip 的时候也需要使用pip3
来替代pip
,使用pip
是无效的
3.2:查看依赖
使用pip3 list
可以查看当前 python3 环境都安装了哪些第三方库:
注意:这个命令只能检测到当前 python3 环境可以使用的第三方库和模块,不包括内建的和标准的!
可见当前我们的 pip3 中只有两个库,一个是 pip3 本身,另外一个 setuptools 是支持 pip3 的:
记住 site-packages 这个路径,后面我们通过 pip3 下载安装的第三方库和模块都会被放到这里!
3.3:最终做法
跟命令行工具内置的 pip3 一样,使用安装程序安装的 python3 内置的 pip3 的版本也不是最新的,同样需要更新:
回忆:我们尝试更新命令行工具自带的 pip3 时,会有如下问题
- 直接更新的话,因为的权限问题,首先会导致原本的 pip3 卸载不掉,其次会将新的 pip3 安装到用户目录下,虽然不影响使用,但此时系统中会存在两个 site-packages 文件夹,当前 python3 可以使用这两个文件夹中的资源;
- 使用
sudo
来更新的话,虽然可以将原本的 pip3 卸载,但却没有把新版的 pip3 安装到旧版的 pip3 位置,而是安装到了/Library/Python/site-packages
中了,并且会在/usr/local/bin
中生成 pip3 和 pip 命令指向这里。假如这样的话,那么以后每次使用 pip3 都要在前面加上sudo
,而且安装最后系统还是会给出提示“Running pip as the ‘root’ user can result in broken permissions and conflicting behaviour with the system package manager”,所以最终放弃这种方案;
而更新自己安装的 python3 中自带的 pip3 时,就不会遇到这样的问题,直接使用终端中提示的命令就可以更新成功!
但是,更新以后终端中可以同时识别“pip3”和“pip”这两个命令!这是因为新版的 pip 会同时安装pip
和pip3
两个命令,所以我干脆就不更新了,理由有三:
- 不更新也能使用,又不是必须的,只是会出现更新的提示;
- 今后不打算直接使用系统默认的 python3,而是用它来创建虚拟环境(即使更新了系统默认的 pip3,创建的虚拟环境对应的 pip3 依然是新安装时未更新的 pip3 版本,所以从这方面看,更新 pip3 也是没必要的);
- 在 macOS 上,我更愿意用“pip3”而非“pip”(因为在命令行中我们也只能使用“python3”而不是“python”,就要整整齐齐,装逼就要装个整套的);
第四节:总结归纳
4.1:安装所得
在整个手动安装 python3 的过程中,安装程序总共做了下面几件事:
生成
/Application/Python 3.9
文件;生成
/Library/Frameworks/Python.framework
文件,这是实际安装的 python3 文件;生成
~/.zprofile
文件,将安装的 python3 添加到环境变量中;假如系统中原本就有这个文件,就会在文件末尾追加配置环境的内容
生成一些链接,在
/usr/local/bin
中;这些链接指向
/Library/Frameworks/Python.framework/Versions/3.9/bin
中的命令;
假如要卸载的话,只需要去复原上面这四项即可!
4.2:系统环境
经过安装命令行工具 CLT 和手动安装 python 3.9.13,此时系统中有两个版本的 python3 环境:
- /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9
- /Library/Frameworks/Python.framework/Versions/3.9
前者是命令行工具中内置的,后者是我们手动安装的,而且此时如下的 python3 命令都是指我们自己安装的:
- /Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9
- /Library/Frameworks/Python.framework/Versions/3.9/bin/python3
- /usr/local/bin/python3.9
- /usr/local/bin/python3
而如下的 pip3 指向我们手动安装的 pip3:
- /Library/Frameworks/Python.framework/Versions/3.9/bin/pip3.9
- /Library/Frameworks/Python.framework/Versions/3.9/bin/pip3
- /usr/local/bin/pip3.9
- /usr/local/bin/pip3
此时,在终端中直接使用 pip3 命令来安装依赖时,依赖会被安装到如下目录:
- /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages