版本控制工具的差異
這里介紹幾個工具:pyenv、pyvenv、 venv、virtualenv、pyenv-virtualenv
- virtualenv
- 是針對python的包的多版本管理,通過將python包安裝到一個模塊來作為python的包虛擬環境,通過切換目錄來實現不同包環境間的切換。其實不是非常愛搗騰的話,此工具就已經可以應付同python版本多環境問題了,安裝使用也非常簡單
- virtualenvwrapper
- 是一組對virtualenv的擴展(請參閱docs )。 它給你的命令像mkvirtualenv , lssitepackages ,特別是在不同的virtualenv目錄之間切換的工作。 如果您想要多個virtualenv目錄,此工具特別有用,由於我使用的pycharm來開發的,每個項目里面一個,所以這個對我來說沒啥用
- pyenv
- 用於隔離Python版本,這樣可以來系統中隨意使用python版本,而不至於影響到線上環境
- pyenv-virtualenv
- pyenv-virtualenv是與pyenv相同的作者pyenv的插件,可以方便地同時使用pyenv和virtualenv,如果是用vim進行開發的話,那么這個非常的方便,但是由於我使用的是pycharm開發,所以這里我並沒有使用.
- pyvenv
- 是Python 3附帶的腳本但是 在Python 3.6中棄用 因為它有問題(更不用說令人困惑的名字)。在Python 3.6+中,確切的等價物是 python3 -m venv
- venv
- 是Python 3附帶的一個包,您可以使用它運行 python3 -m venv (雖然由於某種原因,一些發行版將它分成一個單獨的發行版包,例如 python3-venv 在Ubuntu / Debian上)。它的用途與此類似virtualenv,並以非常類似的方式工作,但它不需要復制Python二進制文件(除了在Windows上)。如果你不需要支持Python 2可以嘗試.實際上我部分業務的部署是使用的這個模塊
pyenv: 便捷的 python 版本管理工具
由於 python 分為 python2 和 python3,它們各自又有許多版本可供選用,如果系統上同時安裝了多個 python,很容易遇到版本切換的問題:
輸入 python 命令的時候,如何快速准確的調出特定版本的 python 解釋器?
這實際上是一個關於 $PATH 環境變量的問題。當輸入 python 命令的時候,系統從左向右搜索 $PATH 環境變量中的各個路徑,並且運行第一個找到的程序。所以解決這個問題的關鍵是動態修改 $PATH 環境變量中儲存的 python 路徑,而 pyenv 通過 shell script 和 shims 技術實現了這一點。使用 pyenv 可以很方便的:
安裝版本
$ pyenv install --list
使用版本號
$ pyenv install 2.7.6
$ pyenv install 3.6.1
python 安裝完成后需要運行
pyenv rehash
使用 pyenv 指定 python 非常方便,只需在某個目錄下執行命令:
$ pyenv local 3.6.1
則在該目錄下運行的 python 都是 3.6.1 版本。
要查看系統中安裝了哪些 python 版本,可以執行命令:
$ pyenv versions
system
2.7.6 (set by /Users/yyuu/path/to/project/.python-version)
* 3.6.1 (set by /Users/yyuu/path/to/project/.python-version)
其中system代表系統自帶的版本,其余是通過 pyenv 安裝的版本,*號表示當前使用的版本。因此:
$ python --version
Python 3.6.1
同樣的,pip等工具都和 3.6.1 版本對應,使用pip安裝軟件包時也會安裝到 3.6.1 對應的目錄下。
以上是對 pyenv 的簡單介紹,詳細說明請參考官方文檔。
pyenv-virtualenv: 管理虛擬環境的插件
pyenv 解決的是同一個系統中不同版本的 python 並存的問題,而 pyenv-virtualenv 解決的是不同項目所依賴的軟件包之間可能產生沖突的問題。在實際使用 python 的過程中,很容易出現這樣的問題:
通過pip安裝軟件包 A 時安裝了 A 所依賴的軟件包 B;之后又通過pip安裝軟件包 C 時再次安裝了 B 並將之前的覆蓋,但是因為 C 和 A 所依賴的 B 版本不同,安裝完 C 后導致 A 無法運行。
pyenv-virtualenv 通過為每個項目設置獨立的虛擬環境(目錄)來解決上述問題。
由於 pyenv-virtualenv 是 pyenv 的一個插件,因此需要首先安裝 pyenv ,然后通過 git 或者 brew 安裝 pyenv-virtualenv。
使用 pyenv-virtualenv 創建虛擬環境:
$ pyenv virtualenv 3.6.1 my-virtual-env-3.6.1
將創建一個名為my-virtual-env-3.6.1的虛擬環境(目錄),並且將 python 3.6.1 對應的bin和lib復制到該環境中。當該虛擬環境被激活后,所有的 python 操作都只在該環境中進行,從而和其它 python 內容隔離。
pyenv-virtualenv 支持自動激活和退出虛擬環境。首先確保在 shell 配置文件中添加了
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
接着在需要使用虛擬環境的目錄(通常是項目目錄)中:建立一個.python-version的文本文件,將虛擬環境名稱(如my-virtual-env-3.6.1)寫在里面即可。之后每次進/出該目錄時,虛擬環境都將自動激活/退出。
也可以用命令手動激活和退出:
$ pyenv activate my-virtual-env-3.6.1
$ pyenv deactivate
查看所有虛擬環境、刪除虛擬環境等更多命令和其他使用細節,請參考官方文檔。
總結
pyenv 用來管理一個系統內多個不同版本的 python,常用命令包括:
pyenv install --list #列出可供安裝的 python 版本
pyenv install <version> #安裝指定版本的 python
pyenv local <version> #在當前目錄下設置 python 版本
pyenv versions #列出系統中安裝的 python 版本
pyenv version #顯示當前目錄下采用的 python 版本
pyenv-virtualenv 用來隔離各個項目的依賴文件,常用命令包括:
pyenv virtualenv [version] <venv-name> #創建虛擬環境
pyenv activate <venv-name> #激活虛擬環境
pyenv deactivate #退出虛擬環境