初学Python,知道Mac自带Python2.7,但是我们又可能用Python3.*,因此多版本管理python就显得很重要,本文就来进行用pyenv进行python多版本管理。
1、安装pyenv
首先我们要已经安装brew,如果没有安装,安装方法如下:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装pyenv,可以用brew进行安装:
brew update brew install pyenv
如果安装出现错误
missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
这类问题,只需要执行以下命令安装即可。
xcode-select --install
如果无法安装成功,请参考本文章节5末尾,直接去苹果开发者软件下载地址去手动下载安装即可。
配置pyenv环境变量:
如果用的自带shell工具,则在Terminal执行:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc exec $SHELL -l
如果个人安装了zshell,则在Terminal执行:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc echo 'eval "$(pyenv init -)"' >> ~/.zshrc exec $SHELL -l
如何查看是自带shell还是zshell呢?执行以下命令即可知道:
echo $SHELL
2、安装python
执行命令查看可安装的python版本:
pyenv install --list
其中形如x.x.x这样的只有版本号的为Python官方版本,其他的形如xxxxx-x.x.x这种既有名称又有版本后的属于“衍生版”或发行版。以最新的python3.9.0为例:
pyenv install 3.9.0 -v
但是会下载Python-3.9.0.tar.xz包,如图所示下载很慢:
$ pyenv install 3.9.0 -v python-build: use openssl@1.1 from homebrew python-build: use readline from homebrew /var/folders/qj/7g6cxp596b93yqm5v8z3k05c0000gn/T/python-build.20201112095616.3069 /usr/bin Downloading Python-3.9.0.tar.xz... -> https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
因此我们有两种方式:
- 更换为国内的镜像库;
- 手动下载Python包。
我们采用手动下载的方式下载包:Python官方下载地址,下载完成后放到如下路径:
~/.pyenv/cache
如果没有此路径,直接创建即可(~/.pyenv因为安装了pyenv是一定存在的,但是可能不存在cache文件夹):
mkdir -p ~/.pyenv/cache
然后进行安装就可以发现直接跳过了下载过程:
$ pyenv install 3.9.0 -v python-build: use openssl@1.1 from homebrew python-build: use readline from homebrew /var/folders/qj/7g6cxp596b93yqm5v8z3k05c0000gn/T/python-build.20201112095950.3796 /usr/bin /var/folders/qj/7g6cxp596b93yqm5v8z3k05c0000gn/T/python-build.20201112095950.3796/Python-3.9.0 /var/folders/qj/7g6cxp596b93yqm5v8z3k05c0000gn/T/python-build.20201112095950.3796 /usr/bin Installing Python-3.9.0... python-build: use readline from homebrew
卸载也很简单:
pyenv uninstall 3.9.0 -v
3、python版本管理
安装完成之后需要对数据库进行更新:
$ pyenv rehash
查看当前已安装的python版本(如果执行pyenv version则直接显示当前版本):
$ pyenv versions * system (set by /home/seisman/.pyenv/version) 3.9.0
其中的星号表示当前正在使用的是系统自带的python。
设置全局的Python版本:
$ pyenv global 3.9.0 $ pyenv versions system * 3.9.0 (set by /home/seisman/.pyenv/version)
确认python版本,直接执行命令python即可:
$ python Python 3.9.0 (default, Nov 12 2020, 10:01:22) [Clang 12.0.0 (clang-1200.0.32.21)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> exit()
可以再次执行python global system再重新切换回系统自带版本。
另外python切换版本有三种形式global、local、shell:
// 不同 python 版本之间切换 // 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式 pyenv global 2.7.16 // 设置 Python 本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高 pyenv local 2.7.16 // 设置 Shell 当前会话,智慧影响当前会话的Python版本,一旦关掉当前Terminal或者另开一个Terminal就失效了 pyenv shell 2.7.16 // 优先级:shell>local>global
注意:
- 系统自带的脚本会以/usr/bin/python的方式直接调用老版本的python,因而不会对系统脚本产生影响;
- 使用pip安装第三方模块时会安装到~/.pyenv/versions/3.4.1下,不会和系统模块发生冲突。
- 使用pip安装模块后,可能需要执行pyenv rehash更新数据库;
4、Python安装路径问题
我们可以这样知道我们安装的Python是放在哪儿的:。
$ python WARNING: Python 2.7 is not recommended. This version is included in macOS for compatibility with legacy software. Future versions of macOS will not include Python 2.7. Instead, it is recommended that you transition to using 'python3' from within Terminal. Python 2.7.16 (default, Jun 5 2020, 22:59:21) [GCC 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.29.20) (-macos10.15-objc- on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> print(sys.path) ['', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip'
, '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7'
, '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin'
, '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac'
, '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages'
, '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk'
, '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old'
, '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload'
, '/Library/Python/2.7/site-packages'
, '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python'
, '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC'] >>>
由此就可以知道我们安装的路径了,有网友总截如下:
- Mac系统自带python路径为/System/Library/Frameworks/Python.framework/Version。这里可能会有多个python版本,里面Current存放系统当前python版本,进入Current/bin,在终端输入./python --version即可查看系统当前python版本(注:若使用python --version命令是查看用户当前python版本而不是系统python版本)
- HomeBrew安装python路径为/usr/local/Cellar/python 里面存放HomeBrew所安装版本,进入2.7.16/bin,在终端输入./python --version即可查看用户当前使用的python版本。如果使用brew工具正确安装python的情况下,用户当前python版本会是新安装的python。
- 系统命令默认路径在/usr/bin,用户命令默认路径在/usr/local/bin(brew安装的命令默认在这个路径下)。如果存在相同的命令,则会依据/etc/paths文件中的环境变量顺序(前面优先于后面)依次查找,查看环境变量也可以在终端输入echo $PATH查看,遵循左面路径优先于右面路径。
5、Mac安装CommandLineTools自带的python
有一天突然发现我mac里面装了一个Python3.8.5,就很好奇如何而来,根据上面第四章节的办法,看到了是commandLineTools下面的:
'/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python38.zip', '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8', '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/lib-dynload', '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/site-packages'
/Library/Developer/CommandLineTools这个目录下的python3应该是在某一个版本的Xcode command line tools安装时生成的,但新版的Xcode command line tools已经不包含python3了,所以你可以先卸载Xcode command line tools,根据苹果官方文档,这个目录可以直接删除:
sudo rm -rf /Library/Developer/CommandLineTools sudo rm -f /usr/bin/python3
但是 /usr/bin/python3 不是随便可以删掉的,以前用su root切换到root用户(切换后显示#号,表示切换成功), 然后执行以下命令即可删除。
chmod 777 /usr/bin/python3
但是macbook pro后来升级后也无法直接完成,是因为已经是read-only了,为了系统保护,防止恶意操作,甚至不允许在根目录虽已创建文件夹了(没有新建文件夹选项了):
但是这个也是可以处理的,操作如下:
关机按 Command+R 重启进入恢复模式, 关闭SIP: 打开终端小工具Terminal, 输入命令:
csrutil disable
正常重启后,重新挂载根目录: 输入命令
sudo mount -uw /
此时就可以删除刚才的文件夹了,同时你还可以顺便在自己的根目录创建个文件夹:
在你喜欢的地方建立data目录, 比如:
mkdir /Users/xxx/data
然后建立软连接:
sudo ln -s /Users/xxx/data /data
关机按 Command+R 重启进入恢复模式, 重新打开SIP: 在终端输入命令
csrutil enable
正常重启,然后就可以正常使用 /data 目录了。
删除完之后,再重新安装Xcode command line tools:
xcode-select --install
如果提示无法安装成功,不用着急,可以手动去苹果官方网站下载,安装即可。
下载地址为:https://developer.apple.com/download/more/,搜索Command Line Tools即可,然后选择一个下载进行安装即可。