在開發Python應用程序時,系統默認的Python版本可能會不兼容這個應用程序, 若是同時開發多個應用程序, 可能會用到好幾個版本的python環境, 這種狀況下,每一個應用可能須要各自擁有一套"獨立"的Python運行環境。virtualenv就是用來爲一個應用建立一套"隔離"的Python運行環境的工具。virtualenv是python的一個虛擬化環境工具,用來創建一個虛擬的python環境,一個專屬於項目的python環境, 用virtualenv 來保持一個乾淨的環境很是有用, 能夠幫助咱們在同一臺host上建立多套純淨的python解釋器環境並實現相互隔離,各個環境下安裝的庫僅限於本身的環境,不會影響到別人。python
動態語言Ruby、Python都有本身的虛擬環境,虛擬環境是程序執行時的獨立執行環境,在同一臺服務器中能夠建立不一樣的虛擬環境供不一樣的系統使用,項目之間的運行環境保持獨立性而相互不受影響。例如項目A在基於Python2的環境中運行,而項目B能夠在基於Python3的環境中運行。Python通virtualenv工具管理虛擬環境。react
簡而言之, Virtualenv是一個建立隔絕的Python環境的工具。virtualenv建立一個包含全部必要的可執行文件的文件夾,用來使用Python工程所需的包。Virtualenv用於建立獨立的Python環境,多個Python相互獨立,互不影響,它可以幫助:
- 在沒有權限的狀況下安裝新套件;
- 不一樣應用可使用不一樣的套件版本;
- 套件升級不影響其餘應用。
- 隔離項目之間的第三方包依賴
- 在沒有權限的狀況下安裝新的Python軟件包
- 還有一個額外的好處:部署應用時,把開發環境的虛擬環境打包到生產環境便可。vim
virtualenv 安裝centos
[root@kevin-test ~]# cat /etc/redhat-release (本文是在centos7下操做並驗證無誤) CentOS Linux release 7.5.1804 (Core) [root@kevin-test ~]# python -V Python 2.7.5 [root@kevin-test ~]# pip -V -bash: pip: command not found 先來安裝pip [root@kevin-test ~]# yum -y install epel-release [root@kevin-test ~]# yum install python-pip [root@kevin-test ~]# pip install --upgrade pip [root@kevin-test ~]# pip -V pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7) 經過pip安裝virtualenv [root@kevin-test ~]# pip install virtualenv Collecting virtualenv Downloading https://files.pythonhosted.org/packages/7c/17/9b7b6cddfd255388b58c61e25b091047f6814183e1d63741c8df8dcd65a2/virtualenv-16.1.0-py2.py3-none-any.whl (1.9MB) 100% |████████████████████████████████| 1.9MB 1.3MB/s Installing collected packages: virtualenv Successfully installed virtualenv-16.1.0 測試安裝後virtualenv的版本 [root@kevin-test ~]# virtualenv --version 16.1.0 查看幫助 [root@kevin-test ~]# virtualenv --help Usage: virtualenv [OPTIONS] DEST_DIR Options: --version show program's version number and exit -h, --help show this help message and exit -v, --verbose Increase verbosity. -q, --quiet Decrease verbosity. -p PYTHON_EXE, --python=PYTHON_EXE The Python interpreter to use, e.g., --python=python3.5 will use the python3.5 interpreter to create the new environment. The default is the interpreter that virtualenv was installed with (/usr/bin/python2) --clear Clear out the non-root install and start from scratch. --no-site-packages DEPRECATED. Retained only for backward compatibility. Not having access to global site-packages is now the default behavior. --system-site-packages Give the virtual environment access to the global site-packages. --always-copy Always copy files rather than symlinking. --relocatable Make an EXISTING virtualenv environment relocatable. This fixes up scripts and makes all .pth files relative. --no-setuptools Do not install setuptools in the new virtualenv. --no-pip Do not install pip in the new virtualenv. --no-wheel Do not install wheel in the new virtualenv. --extra-search-dir=DIR Directory to look for setuptools/pip distributions in. This option can be used multiple times. --download Download preinstalled packages from PyPI. --no-download, --never-download Do not download preinstalled packages from PyPI. --prompt=PROMPT Provides an alternative prompt prefix for this environment. --setuptools DEPRECATED. Retained only for backward compatibility. This option has no effect. --distribute DEPRECATED. Retained only for backward compatibility. This option has no effect. --unzip-setuptools DEPRECATED. Retained only for backward compatibility. This option has no effect.
virtualenv 使用bash
如今爲某一個工程建立一個虛擬環境, 建立一個獨立的Python運行環境,命名爲pj_test (這是虛擬環境目錄名,目錄名可自行自定義) [root@kevin-test ~]# cd /opt/ [root@kevin-test opt]# mkdir project_test [root@kevin-test opt]# cd project_test [root@kevin-test project_test]# virtualenv --no-site-packages pj_test New python executable in /opt/project_test/pj_test/bin/python2 Also creating executable in /opt/project_test/pj_test/bin/python Installing setuptools, pip, wheel... done. 如上命令virtualenv就能夠建立一個獨立的Python運行環境,這裏還加上了參數--no-site-packages (也能夠不跟這個參數),這樣已經安裝到系統Python環境 中的全部第三方包都不會複製過來,因而就獲得了一個不帶任何第三方包的"乾淨"的Python運行環境。 上面命令將會在當前的目錄中建立一個文件夾pj_test,這個文件夾包含一些Python執行文件,以及pip副本,用於安裝其餘的packges。 虛擬環境的名字(此例中是pj_test )能夠是任意的;若省略名字將會把文件均放在當前目錄。 [root@kevin-test project_test]# ls pj_test [root@kevin-test project_test]# ls pj_test/ bin include lib lib64 [root@kevin-test project_test]# yum install -y tree [root@kevin-test project_test]# tree pj_test/bin pj_test/bin ├── activate ├── activate.csh ├── activate.fish ├── activate.ps1 ├── activate_this.py ├── easy_install ├── easy_install-2.7 ├── pip ├── pip2 ├── pip2.7 ├── python -> python2 ├── python2 ├── python2.7 -> python2 ├── python-config └── wheel [root@kevin-test project_test]# tree pj_test/include/ pj_test/include/ └── python2.7 -> /usr/include/python2.7 [root@kevin-test project_test]# tree pj_test/lib| head -3 pj_test/lib └── python2.7 ├── _abcoll.py -> /usr/lib64/python2.7/_abcoll.py 新建的Python環境被放到當前目錄下的pj_test目錄。有了pj_test這個Python環境,能夠用source激活虛擬環境: [root@kevin-test project_test]# pwd /opt/project_test [root@kevin-test project_test]# ls pj_test [root@kevin-test project_test]# cd pj_test/ [root@kevin-test pj_test]# source ./bin/activate (pj_test) [root@kevin-test pj_test]# python -V Python 2.7.5 激活虛擬環境, 在虛擬環境裏, 任何使用pip安裝的包將會放在 venv 文件夾中,與全局安裝或其餘應用的Python環境徹底隔絕開。 若是建立虛擬環境時不選擇指定的python版本, 那麼虛擬環境建立後默認就是系統默認的python版本. 好比若是系統還有一個python3.6.1, 路徑爲: /usr/local/python3/bin/python3 [root@kevin-test pj_test]# /usr/local/python3/bin/python3 -V Python 3.6.1 則建立虛擬機時選擇指定的python版本 [root@kevin-test project_test]# virtualenv --no-site-packages -p /usr/local/python3/bin/python3.6.1 pj_test [root@kevin-test project_test]# cd pj_test/ [root@kevin-test pj_test]# source ./bin/activate (pj_test) [root@kevin-test pj_test]# python -V Python 3.6.1 能夠在服務器上提早安裝多個版本的python環境, 不一樣版本的python的二進制路徑不同 而後在使用virtualenv建立各個項目的虛擬環境時指定不一樣的python版本, 這樣各個項目python解釋器環境就實現了相互隔離, 很是純淨! 使用"deactivate" 命令退出或停用虛擬環境: [root@kevin-test project_test]# cd pj_test/ [root@kevin-test pj_test]# source ./bin/activate (pj_test) [root@kevin-test pj_test]# python -V Python 2.7.5 (pj_test) [root@kevin-test pj_test]# deactivate [root@kevin-test pj_test]# 退出虛擬環境後, 此時就回到了正常的環境,如今pip或python均是在系統Python環境下執行。 退出虛擬環境後, 以前在虛擬環境裏的部署的應用程序的使用都不會受到影響! 徹底能夠針對每一個應用建立獨立的Python運行環境,這樣就能夠對每一個應用的Python環境進行隔離。 若是要刪除一個虛擬環境, 只需刪除它的虛擬目錄便可, 好比要刪除虛擬環境pj_test, 則: [root@kevin-test pj_test]# rm -rf /opt/project_test/pj_test/
在虛擬環境安裝 Python packages服務器
Virtualenv 附帶有pip安裝工具,所以須要安裝的packages能夠直接運行: (pj_test) [root@kevin-test pj_test]# pip install [套件名稱] (pj_test) [root@kevin-test pj_test]# pip -V pip 18.1 from /opt/project_test/pj_test/lib/python2.7/site-packages/pip (python 2.7) (pj_test) [root@kevin-test pj_test]# pip install jinja2 安裝後, 能夠在虛擬環境裏找到這個套件 (pj_test) [root@kevin-test pj_test]# ll -d /opt/project_test/pj_test/lib/python2.7/site-packages/jinja2/ drwxr-xr-x 2 root root 4096 Dec 17 18:26 /opt/project_test/pj_test/lib/python2.7/site-packages/jinja2/ 在虛擬環境下,用pip安裝的包都被安裝到對應虛擬的這個環境下,系統Python環境不受任何影響。 也就是說,虛擬環境是專門針對具體的某個應用建立的。 [root@kevin-test ~]# pip -V pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7) 若是沒有啓動虛擬環境,系統環境也安裝了pip工具,那麼packages將被安裝在系統環境中. 爲了不發生此事,能夠在~/.bashrc文件中加上 (最好添加下面的內容): [root@kevin-test ~]# vim ~/.bashrc export PIP_REQUIRE_VIRTUALENV=true 使配置生效 [root@kevin-test ~]# source ~/.bashrc 若是在沒開啓虛擬環境時, 在虛擬環境以外的系統上運行pip,就會提示錯誤:"Could not find an activated virtualenv (required)".
如上安裝好virtualenv以後, 就能夠解決python版本衝突問題和python庫不一樣版本的問題了!!app
virtualenv 用法小總結運維
1) 建立環境 virtualenv [新環境名] :這會再當前目錄下建立一個新環境目錄 可以使用 virtualenv --help 來查看如何使用。可使用參數 --python=/usr/bin/python3 來建立一個已經安裝的的Python環境。 2) 使用環境 切換到項目的新環境目錄 執行:source ./bin/activate 來激活環境,激活後在命令行的前面會出現新環境名稱 接下來可以使用pip命令安裝新環境須要的各類包。(pip命令在建立新環境時自帶) 3) 退出虛擬環境 deactivate 若是要刪除虛擬環境,只需退出虛擬環境後,刪除對應的虛擬環境目錄便可。不影響其餘環境。 4) 注意事項 若是沒有啓動虛擬環境,系統也安裝了pip工具,那麼套件將被安裝在系統環境中,爲了不發生此事,能夠在~/.bashrc文件中加上:export PIP_REQUIRE_VIRTUALENV=true 或者讓在執行pip的時候讓系統自動開啓虛擬環境:export PIP_REQUIRE_VIRTUALENV=true 5) 保證環境一致性 用pip freeze查看當前安裝版本 [root@kevin-test ~]# pip freeze 另外: [root@kevin-test ~]# pip freeze > requirements.txt 這將會建立一個 requirements.txt 文件,其中包含了當前環境中全部包及 各自的版本的簡單列表。 可使用 "pip list"在不產生requirements文件的狀況下, 查看已安裝包的列表。 這將會使另外一個不一樣的開發者(或者是你本人,若是你本人須要從新建立這樣的環境) 在之後安裝相同版本的相同包變得容易。 將這個requirements.txt拷貝到新的機器環境下執行: # pip install -r requirements.txt 這能幫助確保安裝、部署和開發者之間的一致性。
虛擬環境管理工具 - Virtualenvwrapper
virtualenv使用起來不是很方便,由於virtual的啓動、中止腳本都在特定目錄,可能一段時間後,你可能會有不少個虛擬環境散落在系統各處,你可能忘記它們的名字或者位置。鑑於virtualenv不便於對虛擬環境集中管理,因此推薦直接使用virtualenvwrapper。 virtualenvwrapper提供了一系列命令使得和虛擬環境工做變得便利。它把你全部的虛擬環境都放在一個地方。python2.7
Virtaulenvwrapper是virtualenv的擴展包,用於更方便管理虛擬環境,它能夠作: - 將全部虛擬環境整合在一個目錄下; - 管理(新增,刪除,複製)虛擬環境; - 切換虛擬環境等等. 安裝virtualenvwrapper (確保virtualenv已提早安裝) [root@kevin-test ~]# pip install virtualenvwrapper Could not find an activated virtualenv (required). 若是出現上面的報錯:"Could not find an activated virtualenv (required)." 解決辦法: 打開~/.bashrc文件, 添加下面的內容 [root@kevin-test ~]# vim ~/.bashrc export PIP_REQUIRE_VIRTUALENV=true [root@kevin-test ~]# source ~/.bashrc 而後接着安裝virtualenvwrapper [root@kevin-test ~]# pip install virtualenvwrapper 若是仍是出現上面的那個報錯:"Could not find an activated virtualenv (required)." 接着執行下面命令(~/.bashrc文件裏設置該參數爲true, 確保pip安裝的包在虛擬環境下; 虛擬環境以外的系統裏執行pip時, 每次須要手動source 這個參數的false值) [root@kevin-test ~]# export PIP_REQUIRE_VIRTUALENV=false 最後再次安裝virtualenvwrapper便可 [root@kevin-test ~]# pip install virtualenvwrapper Collecting virtualenvwrapper Using cached https://files.pythonhosted.org/packages/2b/8c/3192e10913ad945c0f0fcb17e9b2679434a28ad58ee31ce0104cba3b1154/virtualenvwrapper-4.8.2-py2.py3-none-any.whl Requirement already satisfied: virtualenv-clone in /usr/lib/python2.7/site-packages/virtualenv_clone-0.4.0-py2.7.egg (from virtualenvwrapper) (0.4.0) Requirement already satisfied: stevedore in /usr/lib/python2.7/site-packages/stevedore-1.30.0-py2.7.egg (from virtualenvwrapper) (1.30.0) Requirement already satisfied: virtualenv in /usr/lib/python2.7/site-packages (from virtualenvwrapper) (16.1.0) Requirement already satisfied: pbr!=2.1.0,>=2.0.0 in /usr/lib/python2.7/site-packages/pbr-5.1.1-py2.7.egg (from stevedore->virtualenvwrapper) (5.1.1) Requirement already satisfied: six>=1.10.0 in /usr/lib/python2.7/site-packages/six-1.12.0-py2.7.egg (from stevedore->virtualenvwrapper) (1.12.0) Installing collected packages: virtualenvwrapper Successfully installed virtualenvwrapper-4.8.2 默認virtualenvwrapper安裝在下面python解釋器中的site-packages,實際上須要運行virtualenvwrapper.sh文件才行; 因此要查找出安裝的virtualenvwrapper.sh執行文件 [root@kevin-test ~]# find / -name virtualenvwrapper* /usr/bin/virtualenvwrapper.sh /usr/bin/virtualenvwrapper_lazy.sh /usr/lib/python2.7/site-packages/virtualenvwrapper-4.8.2-py2.7-nspkg.pth /usr/lib/python2.7/site-packages/virtualenvwrapper /usr/lib/python2.7/site-packages/virtualenvwrapper-4.8.2.dist-info 此時還不能使用virtualenvwrapper,每次要想使用virtualenvwrapper 工具時,都必須先激活virtualenvwrapper.sh文件才行, 另外,若是建立前要將即將的環境保存到虛擬環境中,就要先設置一下環境變量 設置環境變量 [root@kevin-test ~]# export WORKON_HOME=~/Envs 建立虛擬環境管理目錄. 即建立的虛擬環境都會放到上面設置的~/Envs目錄下面 [root@kevin-test ~]# mkdir -p $WORKON_HOME 在~/.bashrc文件裏配置環境變量, 添加下面兩行 第一行表示: 存放虛擬環境目錄 第二行表示: virtrualenvwrapper.sh執行文件的路徑 [root@kevin-test ~]# vim ~/.bashrc export WORKON_HOME=~/Envs source /usr/bin/virtualenvwrapper.sh 使得以上環境變量的配置生效 [root@kevin-test ~]# source ~/.bashrc 如今開始使用Virtualenvwrapper 管理虛擬機 (能夠刪除上面以前建立的虛擬環境/opt/project_test/pj_test 了, 後續都將使用Virtualenvwrapper建立和管理虛擬環境) a) 使用mkvirtualenv 命令建立虛擬環境 建立一個虛擬環境, 虛擬機名稱爲project_kevin: [root@kevin-test ~]# mkvirtualenv project_kevin New python executable in /root/Envs/project_kevin/bin/python2 Also creating executable in /root/Envs/project_kevin/bin/python Installing setuptools, pip, wheel... done. virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/predeactivate virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/postdeactivate virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/preactivate virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/postactivate virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/get_env_details (project_kevin) [root@kevin-test ~]# 再建立另外一個虛擬機, 虛擬機名稱爲project_bobo (project_kevin) [root@kevin-test ~]# deactivate //先退出上面的那個虛擬環境 [root@kevin-test ~]# mkvirtualenv --no-site-packages project_bo //這裏加上了參數--no-site-packages New python executable in /root/Envs/project_bo/bin/python2 Also creating executable in /root/Envs/project_bo/bin/python Installing setuptools, pip, wheel... done. virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/predeactivate virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/postdeactivate virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/preactivate virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/postactivate virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/get_env_details (project_bo) [root@kevin-test ~]# ==================================================== 還能夠選擇指定的python版本進行虛擬環境的建立, 不過指定的python版本必需要提早安裝好, 好比 # mkvirtualenv project_hui --python=python3.6.1 # mkvirtualenv project_hui --python=/usr/local/python3/bin/python3.6.1 ==================================================== 建立的虛擬環境的項目目錄都放在了上面設置的環境變量目錄~/Envs下面 [root@kevin-test ~]# ll -d ~/Envs/project_kevin/ drwxr-xr-x 5 root root 56 Dec 17 22:27 /root/Envs/project_kevin/ [root@kevin-test ~]# ll -d ~/Envs/project_bo/ drwxr-xr-x 5 root root 56 Dec 17 22:28 /root/Envs/project_bo/ b) 使用workon 或者 lsvirtualenv 命令列出虛擬環境列表 [root@kevin-test ~]# workon project_bo project_kevin 或者 [root@kevin-test ~]# lsvirtualenv project_bo ========== project_kevin ============= c) 使用workon 啓動/切換虛擬環境 [root@kevin-test ~]# workon project_bo (project_bo) [root@kevin-test ~]# python -V Python 2.7.5 (project_bo) [root@kevin-test ~]# 建立一個項目,它會建立虛擬環境,並在 $WORKON_HOME 中建立一個項目目錄。 當您使用 "workon 項目的虛擬環境名稱" 時,它會自動cd -ed 到項目目錄中。 d) 使用deactivate命令退出/離開虛擬環境,和virutalenv同樣的命令 [root@kevin-test ~]# workon project_bo (project_bo) [root@kevin-test ~]# python -V Python 2.7.5 (project_bo) [root@kevin-test ~]# deactivate [root@kevin-test ~]# e) 使用rmvirtualenv 命令 刪除虛擬環境 [root@kevin-test ~]# lsvirtualenv project_bo ========== project_kevin ============= [root@kevin-test ~]# rmvirtualenv project_bo Removing project_bo... [root@kevin-test ~]# lsvirtualenv project_kevin ============= f) 使用lssitepackages命令顯示 site-packages 目錄中的內容。 [root@kevin-test ~]# workon project_kevin (project_kevin) [root@kevin-test ~]# lssitepackages easy_install.py pip pkg_resources setuptools-40.6.3.dist-info wheel-0.32.3.dist-info easy_install.pyc pip-18.1.dist-info setuptools wheel g) 使用cdvirtualenv命令導航到當前激活的虛擬環境的目錄中,好比說這樣就可以瀏覽它的site-packages。 [root@kevin-test ~]# workon project_kevin (project_kevin) [root@kevin-test site-packages]# cdvirtualenv (project_kevin) [root@kevin-test project_kevin]# ls bin include lib lib64 h) 使用cdsitepackages命令直接進入到 site-packages 目錄中, 和上面的cdvirtualenv 相似 [root@kevin-test ~]# workon project_kevin (project_kevin) [root@kevin-test ~]# cdsitepackages (project_kevin) [root@kevin-test site-packages]# ls easy_install.py pip pkg_resources setuptools-40.6.3.dist-info wheel-0.32.3.dist-info easy_install.pyc pip-18.1.dist-info setuptools wheel ============================================= 爲了方便運維管理, 能夠進行一些別名設置, 以下: [root@kevin-test ~]# vim ~/.bashrc #virtualenv alias vte='virtualenv' alias mkvte='mkvirtualenv' alias deact='deactivate' alias rmvte='rmvirtualenv' alias lsvte='lsvirtualenv' alias won='workon' 使得上面配置生效 [root@kevin-test ~]# source ~/.bashrc 使用別名進行操做 [root@kevin-test ~]# lsvte project_kevin ============= [root@kevin-test ~]# won project_kevin (project_kevin) [root@kevin-test ~]# deact [root@kevin-test ~]# rmvte project_kevin Removing project_kevin... [root@kevin-test ~]# lsvte [root@kevin-test ~]#
virtualenv使用時遇到的一個坑點, 常常排查驗證, 得出結論以下:ide
1) root用戶和普通用戶均可以建立虛擬環境(好比虛擬環境名稱爲venv),venv虛擬環境的相關文件和文件夾的owner都是該用戶, 若是是非root的其餘用戶激活該venv虛擬環境的話,會由於文件權限的問題致使python庫安裝失敗!! 因此說: 非root用戶不要去激活使用其餘用戶建立的venv虛擬環境! 2) 一旦以用戶A的身份激活venv虛擬環境後,在虛擬環境中就不能再經過su命令切換其餘用戶,不然會自動退出虛擬環境! 因此說: 在虛擬環境中不要經過su切換用戶! 3) 以用戶A的身份激活某venv虛擬環境後,在虛擬環境中全部經過"sudo + cmd"執行的命令,都等同於在虛擬環境外執行。 因此說: 在虛擬環境中不要經過sudo執行命令 以上提到的3個小問題,在使用virtualenv的時候必定要注意。