推薦一款Python開發環境管理神器

前言

在Python開發中,有些狀況下,咱們可能面臨在一臺機器上同時安裝多版本Python的需求。好比:python

  • 有多個Python項目,每一個項目依賴不一樣的Python版本。
  • 有一個Python項目,它須要同時支持多個Python版本。

那麼,如何高效地在單臺機器上實現多個版本Python(具體來講,這裏Python指的是Python解釋器)的安裝和維護呢?git

除此以外,咱們還可能面臨在一臺機器上安裝多個版本的某個Python第三方庫的需求。好比:有多個Python項目,每一個項目依賴於不一樣版本的Python第三方庫requests。這時候,如何在單臺機器上實現多版本Python requests庫的安裝和維護呢?github

本文介紹一款神器。它提供了最簡潔的方法,讓上述兩種需求同時獲得知足。sql

多版本Python管理

實現多版本Python管理的工具叫作pyenv。它的安裝命令爲:shell

curl https://pyenv.run | bash
複製代碼

安裝完成後,須要進行簡單配置。將下面幾行配置信息添加到文件~/.bashrc中,而後執行命令exec "$SHELL",讓配置生效。bash

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
複製代碼

接着,能夠經過查看pyenv版原本檢查安裝和配置是否成功:curl

root@hzettv53:~# pyenv -v
pyenv 1.2.12
複製代碼

因爲pyenv是基於源代碼進行Python的編譯和安裝的。所以,咱們須要先安裝編譯相關的一些依賴包。因爲這些依賴是操做系統相關的。所以,不一樣的操做系統,安裝命令不一樣。工具

以常見的Ubuntu/Debian系統爲例,安裝命令爲:ui

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl
複製代碼

如今就可使用pyenv安裝Python了。安裝新版本以前,咱們先查看系統當前安裝的Python版本:url

root@hzettv53:~# pyenv versions
* system (set by /root/.pyenv/version)
root@hzettv53:~# python -V
Python 2.7.12
複製代碼

可見,當前使用的是操做系統自帶的Python,其版本爲2.7.12。這時,若是咱們須要安裝一個新的版本,例如Python 3.7.2, 只需執行命令:

pyenv install -v 3.7.2
複製代碼

注意,因爲pyenv是基於Python源代碼進行編譯安裝,所以這一步驟會有點慢,須要耐心等待。安裝完成後,查看系統中的Python版本:

root@hzettv53:~# pyenv versions
* system (set by /root/.pyenv/version)
3.7.2
root@hzettv53:~# python -V
Python 2.7.12
複製代碼

能夠看到,系統中已經有兩個版本的Python了。可是當前使用的仍然是系統版本。若是想要使用新安裝的版本,只需:

root@hzettv53:~# pyenv global 3.7.2
root@hzettv53:~# pyenv versions
  system
* 3.7.2 (set by /root/.pyenv/version)
root@hzettv53:~# python -V
Python 3.7.2
複製代碼

這裏命令pyenv global 3.7.2改變了全局的Python版本。若是隻想在當前文件夾中使用Python 3.7.2,那麼能夠執行:pyenv local 3.7.2;若是隻想在當前Shell環境中使用Python 3.7.2,那麼能夠執行:pyenv shell 3.7.2

若是同時設置了global, local和shell三種Python版本,那麼哪種會真正生效呢?這裏有一個優先級排序,即shell > local > global。舉例來講,若是前後執行了pyenv local 3.7.2pyenv global 3.7.3,那麼因爲local的優先級高於global,因此當前生效的Python版本是3.7.2。

這樣,咱們便很方便地實現了單一機器上安裝多個版本的Python,而且能夠根據實際須要,靈活地切換Python版本。

多虛擬環境管理

不一樣項目之間,不只依賴的Python版本可能不一樣,並且依賴的Python第三方庫的版本也可能不一樣。咱們將項目所依賴的Python及其第三方庫統一稱爲虛擬環境。若是同時存在多個Python項目,各自依賴不一樣的虛擬環境,如何有效管理呢?

這時,咱們仍然可使用pyenv來達成咱們的目標。使用下述命令能夠建立一個指定Python版本的虛擬環境。

pyenv virtualenv <python_version> <environment_name>
複製代碼

虛擬環境的名稱建議體現Python項目名稱。例如,咱們有一個叫作myproject的項目,而且基於Python 3.7.2進行開發,那麼能夠執行命令:

pyenv virtualenv 3.7.2 myprojectenv
複製代碼

這樣,咱們便建立了一個名爲myprojectenv的虛擬環境。那麼如何使用它呢?咱們在須要使用這個虛擬環境的地方(例如,cd到項目myproject的文件夾路徑),執行如下命令便可:

pyenv local myprojectenv
複製代碼

這時,咱們能夠看到,當前使用的Python和pip都指向的是虛擬環境myprojectenv

root@hzettv53:~/workspace/test# pyenv which python
/root/.pyenv/versions/myprojectenv/bin/python
root@hzettv53:~/workspace/test# pyenv which pip
/root/.pyenv/versions/myprojectenv/bin/pip
複製代碼

這意味着,咱們此時用pip命令安裝的全部Python第三方包,都是安裝到了虛擬環境myprojectenv的路徑下,而不是系統路徑。這樣,咱們便實現了Python項目和其所依賴的Python開發環境(即虛擬環境)的綁定。不一樣的Python項目,徹底能夠各自使用不一樣的Python虛擬環境,互不影響。

那麼,若是一個Python項目須要使用兩種Python虛擬環境呢?咱們只須要建立兩個虛擬環境(例如myprojectenvmyprojectenv2),而且在使用時進行切換便可:

root@hzettv53:~/workspace/myproject# pyenv local myprojectenv
root@hzettv53:~/workspace/myproject:~# python -V
Python 3.7.2
root@hzettv53:~/workspace/myproject# pyenv local myprojectenv2
root@hzettv53:~/workspace/myproject:~# python -V
Python 2.7.12
複製代碼

總結

開發環境的高效管理是軟件工程中的一個難題,尤爲是須要同時維護多個環境的時候。pyenv提供了在單臺機器上實現多版本Python和多類型Python虛擬環境的有效管理。pyenv的使用十分簡單,易於上手。想要更多地瞭解pyenv,能夠閱讀:

相關文章
相關標籤/搜索