oynix

于无声处听惊雷,于无色处见繁花

管理 MacOS 上的 Python 环境版本

00.前言

MacOS 上的 Python不同版本的环境一直是个让人头大的问题,原因在于,系统预先安装了2.7版本,但这是个老版本了,老版本是不能卸载的,一些系统程序都在依赖它。

现在市面上开发的新程序多数在用3.x版本,部分老代码还在用2.x版本,两个大版本还是有些区别的,无法完全兼容,这就让管理多版本共存成了个问题。

当然,也有一些管理工具,如pyenv,但其实python的venv模块已经足够了,下面会简单说一说使用。

01.卸载干净

据不完全统计,目前发现了以下这些还算固定的安装目录:

  • 自己安装的Python在这个目录,即通过官网下载的安装程序安装
    /Library/Frameworks/Python.framework

  • Python应用目录
    /Applications/Python3.x

  • 通过brew命令安装在这个目录,brew是个包管理工具,使用它安装的都在Cellar目录
    /usr/local/Cellar

  • 通过CommandLineTools安装在这个目录,这是个Xcode带的工具包
    /Libaray/Developer/CommandLineTools/Library/Frameworks

  • 系统预安装的在这个目录,这个看看就行了,不能删
    /System/Library/Frameworks/Python.framework

1
2
$ which python
$ which python3

通过这两个命令,找到python可执行程序

  • /usr/local/bin,这个目录下的,可以删除
  • /usr/bin,这个目录下的,想删也删不了,没权限。Catalina以下的通过关闭SIP可以操作/usr/bin目录下的文件,但以上的版本关掉SIP也不行了。我在早年间通过这种方式在/usr/bin目录下放了一个python3的可执行程序,现在升级到了Big Sur版本,导致这个可执行文件删不掉了,除了重装系统,我也没想到什么好办法,暂时就先这么放着。

终端窗口执行python会进入2.7的交互解释环境,执行python3会报错command not found

1
2
3
4
5
6
7
8
9
$ python3
-bash: python3: command not found

$ which python
/usr/bin/python

$ python
WARNING: Python 2.7 is not recommended.
This version is included in macOS for compatibility with legacy software.

至此,现在系统里应该只剩下系统预安装的python2.7了,可执行文件在/usr/bin目录,同时/usr/local/bin目录不再有python可执行文件。

02.安装最新

直接用brew安装就好,别再用其他的各路神仙工具了,听我一句劝,不要在意别人怎么怂恿,就用brew就可以了,这个是macOS上最普遍、最通用的包管理工具,用最简单的方式做最大的事,多了不起。

如果不是新买的机器,应该都装了brew工具了,要是没装,那就先装一下,一行代码,等着就好了

1
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果发现访问困难,卡住、网速慢,可以使用国内镜像网站,下面这个是中科大的,速度还可以

1
$ ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"

然后,安装python3,一行代码,还是等着就好了,python3有多个版本,3.6、3.7、3.8以及最新的3.9,不指定版本会默认安装最新,如果有需要,可以指定版本:python@3.x,如果同时存在多个3.x,要注意名字的区分

1
$ brew install python3

这里唠叨几句pip,pip是python的包管理工具,前身是easy_install,这两者的关系是,python是可执行文件,pip是python的一个模块,可有也可无,非必需,建议还是用pip,毕竟其他方式管理包很麻烦。如果意外把pip删除了也可以单独安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装
$ python3 -m ensurepip
$ python3 -m pip install pip --upgrade
# 目标位置
$ which pip
/usr/local/bin/pip
# 卸载
$ python3 -m pip uninstall pip

# 默认会安装这个三个,再安装用pip install {package}即可
$ pip list -v
pip 21.1.2 /usr/local/lib/python3.9/site-packages pip
setuptools 57.0.0 /usr/local/lib/python3.9/site-packages pip
wheel 0.36.2 /usr/local/lib/python3.9/site-packages pip

一个pip关联一个python可执行文件,像上面这样,就是将pip关联到了python3,通过这个pip安装的包只有python3可调用到,系统自带的python调用不到,如果有需要,也可以为系统python可执行文件也装个pip工具,但要注意名字的区分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 安装
$ python -m ensurepip
# python是系统自带的,但没有操作系统目录的权限,所以需要加上--user
$ python -m pip install pip --upgrade --user
# --user后会安装到当前用户目录库下,我的在这
$ cd /Users/{username}/Library/Python/2.7/bin
# 然后在pip同样的位置创建一个软连接就可以了
$ ln -s /Users/{username}/Library/Python/2.7/bin/pip /usr/local/bin/pip2
# 目标位置
$ which pip2
/usr/local/bin

# 卸载
python -m pip uninstall

# 这个就比较多了,而且都在系统目录里,咱也操作不了
# 再安装要加--user,这样会安装到当前用户目录库文件下: pip2 install {package} --user
# /Users/{username}/Library/Python/2.7/lib/python/site-packages
$ pip2 list -v
altgraph 0.10.2 /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
asn1crypto 0.24.0 /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
bdist-mpkg 0.5.0 /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
bonjour-py 0.3 /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python

03.日常使用

日常使用是通过venv模块,一般一个项目使用一个venv环境,互相独立、互不干扰。

这种模式,就像是在一座大房子(机器)里可以建造很多不同类型(版本)的小房间(虚拟环境),每个小房间(虚拟环境)里的操作的影响范围只限于在这个房间(虚拟环境)内,各个房间(虚拟环境)互相独立互不影响,房间(虚拟环境)可以随时创建(新建)和拆除(删除)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 切换到项目的根目录下
$ cd PyProj

# 创建一个venv环境,第二个参数venvDir是环境目录的名称,一般使用venv,可随意,合法即可
$ python3 -m venv venvDir

# 查看虚拟环境,可看到如下内容
$ ls -l venvDir
drwxr-xr-x 12 username staff 384 Jun 8 23:44 bin
drwxr-xr-x 2 username staff 64 Jun 8 23:44 include
drwxr-xr-x 3 username staff 96 Jun 8 23:44 lib
-rw-r--r-- 1 username staff 90 Jun 8 23:44 pyvenv.cfg

# 激活当前venv环境,之后每行前面会多个(venvDir),表示在该环境中
$ source venvDir/bin/activate

# 查看python可执行文件位置,此时在虚拟环境中,只有一个python,所以不要再输入python3
(venvDir)$ which python
PyPorj/venvDir/bin/python

# 查看pip
(venvDir)$ which pip
PyPorj/venvDir/bin/pip

# 此时的python可执行程序和pip可执行程序只在当前环境内有效,若要退出当前环境则执行
(venvDir)$ deactivate

注意,如果在IDE(如PyCharm)的Terminal里执行创建venv的命令,可能会报权限的错,使用系统的终端便可正常使用。

04.附录

  • 查看pip版本

    1
    $ pip -V
  • 用pip安装package时,加上–user参数,会安装到当前用户的库目录中,只对当前用户有效,不加–user会安装到全局目录,对所有用户有效。如果你的电脑只有一个用户,那么二者没有区别

    1
    2
    3
    4
    5
    $ pip install --user
    ~/Library/Python/3.9/lib/python/site-packages/

    $ pip install
    /usr/local/lib/python3.9/site-packages/
  • brew安装目录
    /usr/local/Cellar
    Homebrew配置目录
    /usr/lcoal/etc
    Homebrew命令目录
    /usr/local/bin

  • brew常用命令
    brew install FORMULA
    brew cleanup
    bew searh FORMULA
    brew info FORMULA
    brew upgrade FORMULA
    brew update

------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2021/06/56ea6b63b2f8/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道