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

  如果安裝出現錯誤

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

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM