第一节:先验知识

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中生成pip3pip。虽然都不影响使用,但这无形之中在系统中添加了好多零零散散的目录,看起来很烦!假如后面产生和依赖相关的问题,势必会对定位问题产生不必要的困扰。

综合以上两点,我最终放弃了命令行内置的 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 会同时安装pippip3两个命令,所以我干脆就不更新了,理由有三:

  • 不更新也能使用,又不是必须的,只是会出现更新的提示;
  • 今后不打算直接使用系统默认的 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