初學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即可,然后選擇一個下載進行安裝即可。