如何在 Mac 上使用 pyenv 運行多個版本的 Python

若是你在 macOS 上運行的項目須要沒有安裝的 Python 版本,請試試 pyenv。html

即便對於有經驗的開發人員,管理本地 Python 開發環境仍然是一個挑戰。儘管有詳細的軟件包管理策略,但仍須要採起另外的步驟來確保你在須要時運行所需的 Python 版本。python

爲何 Python 版本重要?

起初這是一個奇怪的概念,可是編程語言會像其餘任何軟件同樣發生變化。它們有錯誤、修復和更新,就像你喜歡的 API 和任何其餘軟件同樣。一樣,不一樣的發行版由稱爲語義化版本的三位數標識。linux

😭😭😭 pic.twitter.com/yt1Z2439W8git

— Denny Perez (@dennyperez18) May 28, 2019github

多年來,Python 2 是該語言的經常使用主要版本。在 2020 年 1 月,Python 2 到達最後壽命,此後,Python 的核心維護者將僅支持 Python 3。Python 3 穩步發展,並按期發佈新更新。對我來講按期獲取這些更新很重要。shell

最近,我試圖在 macOS 上運行一個依賴於 Python 3.5.9 的項目,而個人系統上並無安裝這個版本。我認爲 Python 包管理器 pip 能夠安裝它,但事實並不是如此:編程

$ pip install python3.5.9
Collecting python3.5.9
  ERROR: Could not find a version that satisfies the requirement python3.5.9 (from versions: none)
ERROR: No matching distribution found for python3.5.9
複製代碼

或者,我也能夠從官方 Python 網站下載該版本,但我如何在個人 Mac 上與現有的 Python 版本一塊兒運行?每次運行時指定 Python 解釋器版本(例如 python3.7 或 python3.5)彷佛很容易出錯。必定會有更好的方法。api

(說明:我知道這對經驗豐富的 Python 開發人員沒有意義,但對當時的我來講是有意義的。我很樂意談一談爲何我仍然認爲它應該這樣作。)bash

安裝和設置 pyenv

值得慶幸的是,pyenv 能夠繞開這一系列複雜的問題。首先,我須要安裝 pyenv。我能夠從源碼克隆並編譯它,可是我更喜歡經過 Homebrew 包管理器來管理軟件包:編程語言

$ brew install pyenv
複製代碼

爲了經過 pyenv 使用 Python 版本,必須瞭解 shell 的 PATH 變量。PATH 決定了 shell 經過命令的名稱來搜索文件的位置。你必須確保 shell 程序可以找到經過 pyenv 運行的 Python 版本,而不是默認安裝的版本(一般稱爲系統版本)。若是不更改路徑,那麼結果以下:

$ which python
/usr/bin/python
複製代碼

這是 Python 的系統版本。

要正確設置 pyenv,能夠在 Bash 或 zsh 中運行如下命令:

$ PATH=$(pyenv root)/shims:$PATH
複製代碼

如今,若是你檢查 Python 的版本,你會看到它是 pyenv 管理的版本:

$ which python
/Users/my_username/.pyenv/shims/python
複製代碼

該導出語句(PATH=)僅會對該 shell 實例進行更改,爲了使更改永久生效,你須要將它添加到點文件當中。因爲 zsh 是 macOS 的默認 shell,所以我將重點介紹它。將相同的語法添加到 ~/.zshrc 文件中:

$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc
複製代碼

如今,每次咱們在 zsh 中運行命令時,它將使用 pyenv 版本的 Python。請注意,我在 echo 中使用了單引號,所以它不會評估和擴展命令。

.zshrc 文件僅管理 zsh 實例,所以請確保檢查你的 shell 程序並編輯關聯的點文件。若是須要再次檢查默認 shell 程序,能夠運行 echo $SHELL。若是是 zsh,請使用上面的命令。若是你使用 Bash,請將 ~/.zshrc 更改成 ~/.bashrc。若是你想了解更多信息,能夠在 pyenvREADME 中深刻研究路徑設置

使用 pyenv 管理 Python 版本

如今 pyenv 已經可用,咱們能夠看到它只有系統 Python 可用:

$ pyenv versions
system
複製代碼

如上所述,你絕對不想使用此版本(閱讀更多有關信息)。如今 pyenv 已正確設置,我但願它能有我常用的幾個不一樣版本的 Python。

有一種方法能夠經過運行 pyenv install --list 來查看 pyenv 能夠訪問的全部倉庫中的全部 Python 版本。這是一個很長的列表,未來回顧的時候可能會有所幫助。目前,我決定在 Python 下載頁面找到的每一個最新的「點版本」(3.5.x 或 3.6.x,其中 x 是最新的)。所以,我將安裝 3.5.9 和 3.8.0:

$ pyenv install 3.5.9
$ pyenv install 3.8.0
複製代碼

這將須要一段時間,所以休息一會(或閱讀上面的連接之一)。有趣的是,輸出中顯示了該版本的 Python 的下載和構建。例如,輸出顯示文件直接來自 Python.org

安裝完成後,你能夠設置默認值。我喜歡最新的,所以將全局默認 Python 版本設置爲最新版本:

$ pyenv global 3.8.0
複製代碼

該版本當即在個人 shell 中設置完成。確認一下:

$ python -V
Python 3.8.0
複製代碼

我要運行的項目僅適於 Python 3.5,所以我將在本地設置該版本並確認:

$ pyenv local 3.5.9
$ python -V
Python 3.5.9
複製代碼

由於我在 pyenv 中使用了 local 選項,因此它向當前目錄添加了一個文件來跟蹤該信息。

$ cat .python-version
3.5.9
複製代碼

如今,我終於能夠爲想要的項目設置虛擬環境,並確保運行正確版本的 Python。

$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python
複製代碼

要了解更多信息,請查看有關在 Mac 上管理虛擬環境的教程。

總結

默認狀況下,運行多個 Python 版本多是一個挑戰。我發現 pyenv 能夠確保在我須要時能夠有我須要的 Python 版本。

你還有其餘初學者或中級 Python 問題嗎? 請發表評論,咱們將在之後的文章中考慮介紹它們。


via: opensource.com/article/20/…

做者:Matthew Broberg 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章
相關標籤/搜索