1. 程式人生 > 實用技巧 >python學習之多版本管理及Python安裝/解除安裝遇到的坑(MAC版)

python學習之多版本管理及Python安裝/解除安裝遇到的坑(MAC版)

  初學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

  配置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即可,然後選擇一個下載進行安裝即可。