macOS上的Python解释器与执行环境
徐徐 抱歉选手

背景

早年看廖雪峰老师的Python教程,说要安装python解释器,那个时候对命令行,虚拟环境之类的根本都没概念,并且当时并不知道Mac系统自带python解释器。所以,直接去官网安装了官方解释器。在命令行下执行python文件。

之后用Pycharm的IDE,每次在新建项目选择python解释器的时候都一头雾水,选也选不到正确的路径,都是泪。

后来为了学习数值计算的课程,安装了anaconda,有了很多anaconda的环境。

有了brew之后,更乱了。

因此下定决心捋一捋自己python解释器路径。

系统中可能存在的Python环境、解释器路径

参考

macOS 上如何切换默认的 Python 版本? - Steven Liu的回答 - 知乎

Install, Uninstall, and Manage Multiple Versions of Python on a Mac

系统自带的/usr/bin/python

Mac系统自带的Python环境的具体依赖为/System/Library/Frameworks/Python.framework/Versions/2.7,对应的解释器就在该目录下的./bin/python2.7。但是Comand Line Tool会在/user/bin/python下去运行这个环境,前后着之间的关系应该是软连接symlink。

不要删除!系统的功能实现依赖于这些框架。

image-20210127105556526

系统自带的/usr/bin/python3

参考StackOverflow的回答:Python 3.7.3 Inadvertently Installed on Mac OS 10.15.1 - Included in Xcode Developer Tools 11.2 Now?

可以看到/usr/bin/python3(此处是具体的依赖/可执行对象),不是映射或者替身。

image-20210125235712385

但是/usr/bin/python是一个symlink,指向的具体可执行文件的位置是/System/Library/Frameworks/Python.framework/Versions/2.7

注意区别这二者的关系。

关于commandlinetools下的python文件

同时在/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework中可以找到替身,在/Applications/Xcode.app/Contents/Developer/us r/bin/python3可以找到python3以及python3.8指向python3.framework。

image-20210125235753815

这几个文件的最终指向都存在于/Applications/Xcode.app/Contents/Developer//Library/Frameworks/Python3.framework/Versions/3.8/Python3这个目录下。

image-20210126000224127

brew安装的环境

参考

Mac 下 Python 环境总结 ( 非 Anaconda)

homebrew 安装python3

homebrew Cellar文件夹下安装的Python解释器

如何查看brew所在目录?在终端输入brew -—prefix,会返回/usr/local,这也就解释了为什么以下的路径都是以此开头。

通过homebrew安装python环境的安装路径为/usr/local/Cellar/,brew里install的brew里uninstall。

可以在终端输入brew list来显示安装了哪些包,输入open /usr/local/Cellar/在finder中查看。一般来说在/usr/local/Cellar/中安装的包,brew都会自动地在/usr/local/bin/中添加symlink。

但是我自己在查看/usr/local/bin/中有执行环境的时候并没有找到对应的可执行文件。于是尝试在终端执行brew install python@3.9,返回了一个warning:

1
Warning: python@3.9 3.9.1_1 is already installed, it's just not linked You can use `brew link python@3.9`  to link this version.

在终端输入brew link python@3.9后,发现/usr/local/bin/中出现了python3.9的symlink。

在此进入/usr/local/Cellar/python@3.9发现有两个文件夹,应该对应了不同的子版本。

image-20210127110027083

尝试进入其中某一个,查看bin文件夹下的二进制文件。

image-20210127110150355

可以看到bin文件夹下的替身都是最终指向/user/local/Cellar/Frameworks/Python.framework/Versions/3.9的文件夹下的可执行文件。

对比系统自带的python路径/System/Library/Frameworks/Python.framework/Versions/2.7,就可以发现除了Prefix有所不同,从/Framework开始路径都是相同的。只是前缀不同,一个是/Systems/Library,另一个是/usr/local

接下来尝试进入/user/local可以得到如下结构,我们可以看到还有一个Framework文件夹,进入查看内容。

image-20210127132023482

可以发现进入这个目录之后还是Python.frameworks,继续深入又可以看见Versions版本号。

image-20210127132159609

最重要的是,这里的Python指向的还是homebrew的Cellar文件夹中安装的Python解释器。

anaconda安装的环境

用户安装anconda3后,anaconda自带默认的python环境base为/Users/drunk99/anaconda3,对应的解释器就在该目录下的./bin/python

如果用户建立了其他anaconda的环境,如名称为myenv,那么python环境为/Users/drunk99/anaconda3/envs/myenv,对应的解释器就是该目录下的./bin/python

anaconda会自动把路径配置到~/.zshrc文件中,无需手动添加路径。

官网pkg安装环境

通过官网pkg安装的环境,也就是用户安装的python环境为/Library/Frameworks/Python.framework/Versions/3.7

对应的解释器就在该目录下的./bin/python3.7

参考CSDN上的卸载教程,以及知乎专栏的安装教程

分为三步骤。

第一步:删除框架sudo rm -rf /Library/Frameworks/Python.framework/Versions/x.x

第二步:删除目录应用sudo rm -rf "/Applications/Python x.x"

第三步:删除指向Python的连接cd /usr/local/bin/ ls -l /usr/local/bin | grep '../Library/Frameworks/Python.framework/Versions/x.x' | awk '{print $9}' | tr -d @ | xargs rm

第四步:在zshrc配置文件中删除python环境路径sudo vim ~/.zshrc进入配置文件,在命令模式下按下dd删除当前光标所在行。退出保存即可。

总结

  1. 不要随意变动或者使用/usr/bin下的可执行文件或者是软连接,包括该软连接指向的可执行文件。
  2. 很多情况下并不需要自己再去python.org官网去下载解释器,使用包管理工具更方便。
  3. 在有了anaconda以及homebrew的python包管理工具后,需要区别二者环境。在conda和brew的默认python环境之上,还有可能会有多个虚拟环境,注意区分。

可能需要用到的终端语句

查看目标文件是否是替身、是否指向哪个具体的可执行文件:ls -l /usr/bin/python

这句话的意思是,hey终端,给我ls/list以下/usr/bin/python这个路径的文件指向哪个-l/link。

从终端打开finder

在finder中查看当前目录的文件:open .。这句话的意思是,hey终端,给我从finder中打开当前路径。

如果想指定位置,可是输入绝对路径open /System/Library/Frameworks/Python.framework/Versions/2.7

查看/修改系统级环境变量

列出系统内置的环境变量的文件:cat /etc/paths,如果要改动各种路径的默认顺序,使用sudo vim /etc/paths操作。注意,这是系统级环境变量,路径以/etc开始。

查看/修改用户级环境变量

查看当前用户级配置好的变量:echo $PATH

修改用户环境变量,只需要修改~/.zshrc或者~/.bashrc(看用哪个shell),sudo vim ~./zshrc进入修改界面。

在文件最底端添加export PATH="/usr/local/bin:$PATH",每一个系统变量都是用:分隔开来的。这句话的意思是,hey终端,帮我把/usr/local/bin的添加到原来$PATH变量的前面,并且作为用户级的新$PATH,搜索路径的时候最先搜索它。

详细请参考macOS/Linux 环境变量设置

  • 本文标题:macOS上的Python解释器与执行环境
  • 本文作者:徐徐
  • 创建时间:2021-01-25 21:01:06
  • 本文链接:https://machacroissant.github.io/2021/01/25/python-envs/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论