python 虛擬環境搭建

擒賊先擒王發表於2017-07-10

參考:http://www.cnblogs.com/wilber2013/p/4774022.html

  1. virtualenv documentation: https://virtualenv.pypa.io/en/latest/

  2. virtualenvwrapper documentation: http://virtualenvwrapper.readthedocs.org/en/latest/

  3. http://docs.python-guide.org/en/latest/dev/virtualenvs/

  4. http://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html

  5. virtualenv 中文文件地址 : http://virtualenv-chinese-docs.readthedocs.io/en/latest/#


前言


由於Python的版本眾多,還有Python2和Python3的爭論,因此有些軟體包或第三方庫就容易出現版本不相容的問題。同時在python開發中,我們可能會遇到一種情況,就是當前的專案依賴的是某一個版本,但是另一個專案依賴的是另一個版本,這樣就會造成依賴衝突。

對於上面的問題,已經有很多現成的個工具可以解決。根據解決上面問題的方法,這些工具大概可以分為兩類:

  • Python 版本環境切換工具
  • 特定Python版本虛擬環境切換工具

Python 版本環境切換工具

Python版本環境切換工具的作用就是讓多個不同版本的Python可以在系統上共存。並且提供簡單的命令來支援不同Python版本之間的切換。

工具

介紹

pyenv

目前最流行的 python版本環境切換工具,但是不支援Windows

pywin

Windows 上pyenv 的替代品,但是功能相對pyenv比較少

py.exe

Python 3.3 版本以後Windows系統自帶的啟動工具(Python Launcher for Windows),可以直接在命令列中使用

特定 Python 版本虛擬環境切換工具

簡單的說,虛擬環境切換工具就是可以根據當前使用的Python版本環境來建立多個虛擬的Python環境。這些虛擬的環境之間相互獨立,可以安裝各個環境所需的Python包。

工具

介紹

virtualenv

目前最流行的 python 虛擬環境配置工具

virtualenvwrapper

使用shell開發,是對virtualenv的一個封裝,簡化了virtualenv命令的使用,並且進行了一些功能擴充套件

virtualenvwrapper-win

使用Windows batch shell開發的virtualenvwrapper

venv

Python 3.3 版本以後自帶的虛擬環境工具,僅支援 python 3.3 和以後版本


pywin


現在看看Windows上Python版本環境切換工具 pywin

對於pywin的工作原理就可以簡單的理解為,通過pywin提供的命令可以簡單的以設定環境變數的方式決定優先使用特定版本的Python。

安裝

對於pywin,我們可以使用原始碼、easy_install和pip三種方式進行安裝,關於這些安裝方式的關係,請參考前一篇文章

下面通過pip來安裝pywin:


常用命令

安裝完成之後就看看pywin的常用命令。

"pyassoc"和"pywin genlaunchers"是兩個配置相關的命令。我本機安裝了2.7和3.4兩個版本的Python,預設環境變數指向2.7,配置完成後就會就會在2.7目錄中生成本機安裝所

有Python版本的launcher。


配置完成之後,就可以通過pywin進行不同版本之間的Python切換了。

1. 開啟環境變數PAHT中第一個Python版本環境

C:\Users\tianw1>pywin
Python 2.7.7 (default, Jun  1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

2. 開啟Python 3.4

C:\Users\tianw1>pywin -3.4
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

3. 將Python 3.4設定為預設的Python執行環境,根據輸出也可以看出,其實就是將Python 3.4目錄放在環境變數PATH的前面位置

C:\Users\tianw1>pywin setdefault 3.4

    Setting default python for active session to: 3.4
    C:\Python34;C:\Python34\Scripts -- now at front of PATH
# 由於Python 3.4中沒有安裝pywin,所以會報錯
C:\Users\tianw1>pywin
'pywin' is not recognized as an internal or external command,
operable program or batch file.

C:\Users\tianw1>python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

4. 即使上面通過pywin將預設Python版本環境設為3.4,但是由於檔案的查詢還是先本地,然後環境變數PATH。所以,下面方式使用的還是2.7版本,同時也可以再通過pywin將2.7設定為預設Python版本環境。

C:\>cd Python27
C:\Python27>python
Python 2.7.7 (default, Jun  1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

C:\Python27>pywin setdefault 2.7

    Setting default python for active session to: 2.7
    C:\Python27;C:\Python27\Scripts -- now at front of PATH

C:\Python27>


virtualenvwrapper-win

在Windows環境中使用"virtualenvwrapper-win"還是比較方便的。

安裝。同樣使用pip進行安裝:pip install virtualenvwrapper-win

常用命令。安裝完成之後,就可以直接使用"virtualenvwrapper-win"提供的命令來建立虛擬環境了。

1. 新建虛擬環境:mkvirtualenv env_name

C:\Users\tianw1>mkvirtualenv py27_dev1
New python executable in py27_dev1\Scripts\python.exe
Installing setuptools, pip, wheel...done.

(py27_dev1) C:\Users\tianw1>pip list
pip (7.1.2)
setuptools (18.2)
wheel (0.24.0)

注意,預設情況虛擬環境不會自通引用原始Python環境中的軟體包,但是可以通過"--system-site-packages"引數來使虛擬環境引用原始Python環境中的軟體包。

C:\Users\tianw1>mkvirtualenv --system-site-packages py27_dev2
New python executable in py27_dev2\Scripts\python.exe
Installing setuptools, pip, wheel...done.
(py27_dev2) C:\Users\tianw1>pip list

2. 離開虛擬環境:deactivate

(py27_dev1) C:\Users\tianw1>deactivate
C:\Users\tianw1> 

3. 列出虛擬環境列表:workon 或lsvirtualenv

C:\Users\tianw1>workon
Pass a name to activate one of the following virtualenvs:
==============================================================================
py27_dev1
py27_dev2

C:\Users\tianw1>lsvirtualenv
dir /b /ad "C:\Users\tianw1\Envs"
==============================================================================
py27_dev1
py27_dev2

C:\Users\tianw1>

4. 刪除虛擬環境:rmvirtualenv env_name

virtualenv

virtualenv 通過建立一個虛擬化的python執行環境,將我們所需的依賴安裝進去的,不同專案之間相互不干擾。然後在每個環境中安裝需要的軟體包(配合 pip 使用),這一系列的環境是相互隔離的。作為一個獨立的環境就不容易出現版本問題,還方便部署。


  1. Github: https://github.com/pypa/virtualenv
  2. Doc: https://virtualenv.pypa.io/en/latest/


virtualenv安裝


VirtualEnv 用於在一臺機器上建立多個獨立的 Python 執行環境,VirtualEnvWrapper 為VirtualEnv 提供了一些便利的命令列上的封裝。

Virtualenv 可用於建立獨立的Python環境,是一個非常好的virtual python environment builder,他最大的好處是,可以讓每一個python專案單獨使用一個環境,而不會影響python系統環境,也不會影響其他專案的環境。在這些環境裡面可以選擇不同的Python版本或者不同的Packages,並且可以在沒有root許可權的情況下在環境裡安裝新套件,互相不會產生任何的影響。

為什麼要用virtualenv ?

- 隔離專案之間的第三方包依賴,如A專案依賴django1.2.5,B專案依賴django1.3。

- 為部署應用提供方便,把開發環境的虛擬環境打包到生產環境即可,不需要在伺服器上再折騰一翻。在伺服器上都不用安裝virtualenv,直接將virtualenv建立的目錄拷貝到伺服器,修改路徑,進行虛擬環境遷移就可以用了

還可以用在沒有root許可權的python環境配置上,如果沒有root許可權,可以先自己搞一個virtualenv,再在virtualenv中使用pip安裝。(系統中沒有pip,並且也沒有root許可權使用sudo apt-get安裝)

虛擬環境中安裝的庫的位置在哪 ?

在虛擬環境中安裝的庫在 env/Lib/site-packages/目錄裡,而不是在系統的python的Lib/site-packages目錄裡,這就是為什麼虛擬環境是分開的。

Note:virtualenv 建立的虛擬環境與主機的 Python 環境完全無關,你主機配置的庫不能在 virtualenv 中直接使用。你需要在虛擬環境中利用 pip install 再次安裝配置後才能使用。


安裝virtualenv比較簡單,無論是在linux系統上還是windows上都可以通過pip來進行安裝,如下:pip install virtualenv
如果安裝不成功也可以下載virtualenv原始碼package,通過執行setup.py來安裝virtualenv。同時因為python2和python3的不同,因此也有了兩種pip和pip3兩種python包安裝工具,而兩種工具安裝的virtualenv也是不相同的,py2安裝的virtualenv虛擬化出來的python執行環境是python2的,py3安裝的virtualenv預設虛擬化環境則是python3的。
網速較好可以通過 pip 來安裝, 系統沒有 pip 的請參考 pip2 或 pip3

pip install virtualenv
pip install setuptools     # 如果提示安裝就執行這個

建立

mkdir myproject              建立專案資料夾 myproject
cd myproject                 進入專案目錄
virtualenv myproject_ENV     建立虛擬環境 myproject_ENV

這時候會發現在 myproject 目錄下新增了一個 myproject_ENV 的資料夾。

使用

cd myproject_ENV            進入虛擬環境目錄 myproject_ENV
source ./bin/activate       啟用

這時候在命令列的最左邊會顯示該虛擬環境的名稱。不妨使用下面的命令檢視一下變化:

which python
which pip
pip list

如果想要退出虛擬環境,使用這個命令就可以了:deactivate


virtualenv 的基本使用

$ virtualenv venv                          建立虛擬環境 
$ virtualenv -p /usr/bin/python2.7 venv    為環境指定Python直譯器: 
$ source venv/bin/activate                 啟用虛擬環境
$ deactivate                               停止虛擬環境。退出虛擬環境
刪除虛擬環境    直接刪除目錄即可

啟用虛擬環境之後就可以通過命令pip install 來安裝python包了,這裡安裝python包就不需要root許可權了,直接就可以安裝十分方便。

在venv的環境中,使用pip安裝的包都不會再是全域性性的包,只會在當前的虛擬環境中起作用,避免了汙染系統環境。

執行pip帶 –no-site-packages 選項的 virtualenv 將不會包括全域性安裝的包. 這可用於保持包列表乾淨, 以防以後需要訪問它. (這在 virtualenv 1.7及之後是預設行為)

virtualenv各種其他命令如下:

$ virtualenv [OPTIONS] DEST_DIR

選項:
--version        顯示當前版本號。
-h, --help       顯示幫助資訊。
-v, --verbose    顯示詳細資訊。
-q, --quiet
不顯示詳細資訊。
-p PYTHON_EXE, --python=PYTHON_EXE    
                    指定所用的python解析器的版本,比如 --python=python2.5 就使用2.5版本的解析器建立新的隔離環境。 
	            預設使用的是當前系統安裝(/usr/bin/python)的python解析器
--clear             清空非root使用者的安裝,並重頭開始建立隔離環境。
--no-site-packages        令隔離環境不能訪問系統全域性的site-packages目錄。
--system-site-packages    令隔離環境可以訪問系統全域性的site-packages目錄。
--unzip-setuptools        安裝時解壓Setuptools或Distribute
--relocatable             重定位某個已存在的隔離環境。使用該選項將修正指令碼並令所有.pth檔案使用相當路徑。
--distribute              使用Distribute代替Setuptools,也可設定環境變數VIRTUALENV_DISTRIBUTE達到同樣效要。
--extra-search-dir=SEARCH_DIRS       用於查詢setuptools/distribute/pip釋出包的目錄。可以新增任意數量的–extra-search-dir路徑。
--never-download                     禁止從網上下載任何資料。此時,如果在本地搜尋釋出包失敗,virtualenv就會報錯。
--prompt==PROMPT                     定義隔離環境的命令列字首。

使用

[root@localhost home]# virtualenv MTP            # 建立名為MTP的虛擬環境
New python executable in /home/MTP/bin/python
Installing setuptools, pip, wheel...done.
[root@localhost home]# ls                               #  會在當前目錄生成一個目錄
MTP
[root@localhost home]# cd MTP/
[root@localhost MTP]# ls
bin  include  lib  lib64  pip-selfcheck.json
[root@localhost MTP]# source ./bin/activate       #  啟動虛擬環境後, 此時命令列會多一個(MTP)
(MTP) [root@localhost MTP]# pip freeze    # MTP為虛擬環境名稱, 接下來所有模組都只會安裝到該目錄
(MTP) [root@localhost MTP]# pip list
pip (9.0.0)
setuptools (28.7.1)
wheel (0.30.0a0)
(MTP) [root@localhost MTP]# deactivate      #  退出虛擬環境, 將回到系統預設的Python直譯器環境
[root@localhost MTP]#

刪除
刪除一個虛擬環境, 只需要刪除它的目錄.  有必要請執行( rm -rf venv )


擴充套件包 Virtualenvwrapper

為了使用virtualenv更方便,可以藉助 virtualenvwrapper。Virtualenvwrapper 的作用是:更方便的建立/啟用/管理/銷燬虛擬環境。

Virtaulenvwrapper是virtualenv的擴充套件包,它提供了一系列命令用於更方便管理虛擬環境,它可以做:
1. 將所有虛擬環境整合在一個目錄下
2. 管理(新增,刪除,複製)虛擬環境
3. 切換虛擬環境 …

virtualenvwrapper 提供環境名字的tab補全功能.

$ sudo pip install virtualenvwrapper            安裝 virtualenvwrapper 
$ source /usr/local/bin/virtualenvwrapper.sh    載入 virtualenvwrapper 

建立虛擬環境 
預設建立的虛擬環境位於 ~/.virtualenvs ,可以通過環境變數 $WORKON_HOME 來定製。 

$ mkvirtualenv test2-env     建立 test2-env 虛擬環境後,會自動啟用環境,注意看Shell提示符的改變:
(test2-env)CL-USER> test2-env$ 

$ mkvirtual [環境名稱]       建立 虛擬環境
$ lsvirtualenv        列出所有虛擬環境
$ workon test2-env    啟用 test2-env 虛擬環境 
$ cdvirtualenv        進入到當前啟用的虛擬環境的目錄中
$ cdsitepackages      進入到當前啟用的虛擬環境的 site-packages 目錄 
$ lssitepackages      列出 site-packages 目錄的所有軟體包 
$ deactivate          停止虛擬環境。離開虛擬環境 
$ rmvirtualenv test2-env    刪除虛擬環境 

安裝

[root@localhost MTP]# pip install virtualenvwrapper
[root@localhost MTP]# echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.bashrc
[root@localhost MTP]# source  ~/.bashrc
[root@localhost MTP]# source $(find /usr -type f -name virtualenvwrapper.sh)

此時virtualenvwrapper就可以使用了; 對於Windows, 可以使用 virtualenvwrapper-win

或者

安裝:sudo easy_install virtualenvwrapper  
此時還不能使用virtualenvwrapper,預設virtualenvwrapper安裝在/usr/local/bin下面,實際上你需要執行virtualenvwrapper.sh檔案才行。
先別急,開啟這個檔案看看,裡面有安裝步驟,我們照著操作把環境設定好。

建立目錄用來存放虛擬環境
mkdir $HOME/.virtualenvs
在~/.bashrc中新增行: export WORKON_HOME=$HOME/.virtualenvs
在~/.bashrc中新增行:source /usr/local/bin/virtualenvwrapper.sh
執行: source ~/.bashrc
此時virtualenvwrapper就可以使用了。


Linux 下的 Python 多版本管理(pyenv)


From: https://my.oschina.net/lionets/blog/267469


pyenv可以幫助你在一臺開發機上建立多個版本的python環境, 並提供方便的切換方法。

virtualenv則提供了一種功能, 就是將一個目錄建立為一個虛擬的python環境, 這樣的話, 使用者可以建立多個虛擬環境, 每個環境裡面的python版本可以是不同的, 也可以是相同的, 而且環境之間相互獨立。

如果解釋得還不是很清楚的話,我們舉例說明。

首先我們可以用pyenv 安裝多個python 版本, 比如安裝了2.5, 2.6, 3.3 三個版本。 使用者可以隨意切換當前預設的python版本。 但這時候, 每個版本的環境仍是唯一的, 如果我們想在環境中安裝一些庫的話, 還是會導致這個版本的環境被修改。 這個時候, 如果我們用virtual env去建立虛擬環境, 就可以完全保證系統路徑的乾淨。無論你在虛擬環境中安裝了什麼程式, 都不會影響已安裝版本的系統環境。



Python3 venv 建立虛擬環境

https://docs.python.org/3/library/venv.html

Python3.3以上的版本通過venv模組原生支援虛擬環境,可以代替Python之前的virtualenv。該venv模組提供了建立輕量級“虛擬環境”,提供與系統python的隔離支援。每一個虛擬環境都有其自己的Python二進位制(允許有不同的Python版本創作環境),並且可以擁有自己獨立的一套Python包。需要注意的是,在Python3.3中使用”venv”命令建立的環境不包含”pip”,你需要進行手動安裝。在Python3.4中改進了這一個缺陷。


重建Python環境

凍結環境

所謂 凍結(freeze) 環境,就是將當前環境的軟體包等固定下來:

$ pip freeze > requirements.txt$ 
$ cat requirements.txt


重建環境

重建(rebuild) 環境就是在部署的時候,在生產環境安裝好對應版本的軟體包,不要出現版本相容 等問題.

$ pip install -r requirements.txt  配合pip,可以批量安裝對應版本的軟體包,快速重建環境,完成部署


後記

使用Python虛擬環境的另一個好處是可以方便的進行部署,對於每個虛擬環境,都可以通過下面的命令很方便的進行環境部署:

  • pip freeze > requirements.txt      將包依賴資訊儲存在requirements.txt檔案
  • pip install -r requirements.txt     會自動從網上下載並安裝所有包

virtualenv就是一個搭建虛擬化的python環境,便於不同的專案在同一臺機器上開發執行。
virtualenv更多的還是適用於本地開發不同的專案,但是在生產環境中還是使用docker給不同的專案建立不同的容器,各自分開執行為好,不宜放在一個單獨的物理機中執行。




相關文章