利用pipenv和pyenv管理多個(gè)相互獨(dú)立的Python虛擬開發(fā)環(huán)境
我們經(jīng)常會(huì)遇到這樣的開發(fā)需求,比如你手頭有多個(gè)開發(fā)項(xiàng)目,其中項(xiàng)目A要求用python3.7,項(xiàng)目B需要用python3.6,有要求項(xiàng)目A和項(xiàng)目B依賴包相互獨(dú)立,互不干擾。為了滿足這樣的開發(fā)需求,我們需要在自己的電腦上安裝多個(gè)Python版本,并且項(xiàng)目之間進(jìn)行環(huán)境隔離。要想安裝多個(gè)Python版本,可以利用pyenv這個(gè)好用的工具,對(duì)于建立多個(gè)項(xiàng)目之間隔離的開發(fā)環(huán)境,可以借助于pipenv這個(gè)更加好用的包管理工具。
這篇文章將給大家介紹如何利用pyenv和pipenv來(lái)管理我們的python開發(fā)環(huán)境,主要講兩個(gè)核心內(nèi)容:
1.如何在同一臺(tái)電腦上管理多個(gè)版本Python;
2.為每一個(gè)項(xiàng)目建立相互隔絕的虛擬環(huán)境。
01 — 安裝多個(gè)Python版本
我們自己開發(fā)的多個(gè)項(xiàng)目或者從github上clone的項(xiàng)目,可能依賴不同的Python解釋器。因此,我們要想運(yùn)行這些項(xiàng)目,在工作電腦上就要安裝不同版本的Python。
pyenv是Python版本管理工具,利用它可以在同一臺(tái)電腦上安裝多個(gè)版本的Python,這個(gè)過(guò)程非常簡(jiǎn)單。
1.1、安裝或升級(jí)pyenv
首先安裝pyenv,如果你是Mac電腦,那么推薦使用Homebrew來(lái)安裝。
$ brew update && brew install pyenv
要想升級(jí)pyenv,則可以執(zhí)行:
$ brew update && brew upgrade pyenv
如果不是Mac電腦,那么就用github方式來(lái)安裝:
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile $ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile $ exec "$SHELL"
這種安裝方式的詳細(xì)說(shuō)明,還是建議大家參考官方文檔:https://github.com/pyenv/pyenv#basic-github-checkout。
對(duì)于github安裝的pyenv,可以按下面方式進(jìn)行升級(jí):
$ cd $(pyenv root) $ git fetch $ git tag v1.2.18 $ git checkout v1.2.18
pyenv安裝完成后,需要將$(pyenv root)/shims添加到PATH變量前面,這一步非常關(guān)鍵。
$ echo 'export PATH="$(pyenv root)/shims:$PATH"' >> ~/.bash_profile $ source ~/.bash_profile
1.2、用pyenv安裝Python
安裝完pyenv,可以安裝Python啦,一共需要兩步。
$ pyenv install 3.7.7 $ pyenv rehash
執(zhí)行命令pyenv versions查看安裝結(jié)果。
$ pyenv versions system * 3.7.7 (set by /Users/chunming.liu/.pyenv/version)
可以看到,已經(jīng)成功安裝了Python 3.7.7,安裝的位置在/Users/chunming.liu/.pyenv。
1.3、切換Python版本
可以通過(guò)pyenv global或者pyenv local切換Python版本。pyenv global屬于全局切換,切換完成后,在系統(tǒng)中任何地方執(zhí)行python,你會(huì)發(fā)現(xiàn)都是同樣的Python版本。
$ pyenv global 3.7.7 $ pyenv versions system * 3.7.7 (set by /Users/chunming.liu/.pyenv/version)
可以看到,3.7.7前面有一個(gè)星號(hào),說(shuō)明成功切換到了3.7.7版本,可以執(zhí)行一下python來(lái)驗(yàn)證一下:
$ python Python 3.7.7 (default, Apr 12 2020, 12:31:11) [Clang 11.0.0 (clang-1100.0.33.17)] on darwin Type "help", "copyright", "credits" or "license" for more information.
pyenv local屬于局部切換,只能修改當(dāng)前目錄下的Python版本,出了當(dāng)前目錄則失效。
接下來(lái),開始為每個(gè)項(xiàng)目建立獨(dú)立的開發(fā)環(huán)境。
02 — 用Pipenv創(chuàng)建虛擬環(huán)境
Pipenv是Python官方推薦的包管理工具。它綜合了 virtualenv , pip 和 pyenv 三者的功能。你可以使用pipenv這一個(gè)工具來(lái)安裝、卸載、跟蹤和記錄依賴性,并創(chuàng)建、使用和組織你的虛擬環(huán)境。
2.1、安裝和升級(jí)pipenv
如果你是Mac電腦,那么推薦使用Homebrew來(lái)安裝和升級(jí)pipenv:
$ brew update && brew install pipenv $ brew update && brew upgrade pipenv
也可以通過(guò)pip來(lái)安裝和升級(jí)pipenv:
$ pip install pipenv $ pip install --upgrade pipenv
2.2、為項(xiàng)目建立虛擬環(huán)境
進(jìn)入到項(xiàng)目目錄中,通過(guò)下面的指令為項(xiàng)目創(chuàng)建虛擬環(huán)境。
$ mkdir pipenv_demo $ cd pipenv_demo $ pipenv --python 3.7.7 Creating a virtualenv for this project… Pipfile: /Users/chunming.liu/work/pipenv_demo/Pipfile Using /Users/chunming.liu/.pyenv/versions/3.7.7/bin/python3 (3.7.7) to create virtualenv… ⠙ Creating virtual environment...Using base prefix '/Users/chunming.liu/.pyenv/versions/3.7.7' New python executable in /Users/chunming.liu/.local/share/virtualenvs/pipenv_demo-RYMSREda/bin/python3 Also creating executable in /Users/chunming.liu/.local/share/virtualenvs/pipenv_demo-RYMSREda/bin/python Installing setuptools, pip, wheel... done. Running virtualenv with interpreter /Users/chunming.liu/.pyenv/versions/3.7.7/bin/python3 ✔ Successfully created virtual environment! Virtualenv location: /Users/chunming.liu/.local/share/virtualenvs/pipenv_demo-RYMSREda
上面的操作,給pipenv_demo這個(gè)項(xiàng)目初始化了一個(gè)Python 3.7.7的虛擬環(huán)境,并在項(xiàng)目錄下生成一個(gè)項(xiàng)目依賴包文件Pipefile。如果系統(tǒng)中沒(méi)有3.7.7版本的Python,pipenv會(huì)調(diào)用pyenv來(lái)安裝對(duì)應(yīng)的Python的版本。
默認(rèn)地,虛擬環(huán)境會(huì)創(chuàng)建在~/.local/share/virtualenvs目錄里面。我們也可以通過(guò)pipenv --venv查看項(xiàng)目的虛擬環(huán)境目錄??梢酝ㄟ^(guò) pipenv --rm 刪除虛擬環(huán)境。
如果想更改虛擬環(huán)境的目錄,可以在 .bashrc 或 .bash_profile 中,設(shè)置環(huán)境變量WORKON_HOME,指定虛擬環(huán)境的目錄所在位置,比如想將虛擬環(huán)境放到~/.venvs目錄,則可以執(zhí)行下面的命令。
$ echo 'export WORKON_HOME=~/.venvs' >> ~/.bash_profile $ source ~/.bash_profile
如果希望在項(xiàng)目目錄下創(chuàng)建虛擬環(huán)境目錄(.venv),需要在 .bashrc 或 .bash_profile 中配置環(huán)境變量PIPENV_VENV_IN_PROJECT:
$ echo 'export PIPENV_VENV_IN_PROJECT=1' >> ~/.bash_profile $ source ~/.bash_profile
03 — 用Pipenv管理依賴包
pipenv使用 Pipfile 和 Pipfile.lock 來(lái)管理依賴包,并且在使用pipenv添加或刪除包時(shí),自動(dòng)維護(hù) Pipfile 文件,同時(shí)生成 Pipfile.lock 來(lái)鎖定安裝包的版本和依賴信息。相比pip需要手動(dòng)維護(hù)requirements.txt 中的安裝包和版本,具有很大的進(jìn)步。
3.1 安裝依賴包
為項(xiàng)目安裝依賴包到虛擬環(huán)境中,使每個(gè)項(xiàng)目擁有相互獨(dú)立的依賴包,是非常不錯(cuò)的Python的開發(fā)實(shí)踐。安裝依賴包到虛擬環(huán)境中的方法:
$ pipenv install pytest Installing pytest… Adding pytest to Pipfile's [packages]… ✔ Installation Succeeded Pipfile.lock not found, creating… Locking [dev-packages] dependencies… Locking [packages] dependencies… ✔ Success! Updated Pipfile.lock (1c4d3d)! Installing dependencies from Pipfile.lock (1c4d3d)… 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 11/11 — 00:00:16 To activate this project's virtualenv, run pipenv shell. Alternatively, run a command inside the virtualenv with pipenv run.
執(zhí)行完上面的命令后,檢查一下是否安裝成功:
$ pipenv graph pytest==5.4.1 - attrs [required: >=17.4.0, installed: 19.3.0] - importlib-metadata [required: >=0.12, installed: 1.6.0] - zipp [required: >=0.5, installed: 3.1.0] - more-itertools [required: >=4.0.0, installed: 8.2.0] - packaging [required: Any, installed: 20.3] - pyparsing [required: >=2.0.2, installed: 2.4.7] - six [required: Any, installed: 1.14.0] - pluggy [required: >=0.12,<1.0, installed: 0.13.1] - importlib-metadata [required: >=0.12, installed: 1.6.0] - zipp [required: >=0.5, installed: 3.1.0] - py [required: >=1.5.0, installed: 1.8.1] - wcwidth [required: Any, installed: 0.1.9]
可看到已經(jīng)安裝了pytest,還列出了pytest的依賴包。
觀察項(xiàng)目的根目錄下,又多了一個(gè)Pipfile.lock文件。這兩個(gè)文件記錄了此項(xiàng)目的依賴包,這兩個(gè)文件的區(qū)別是 Pipfile中安裝的包不包含包的具體版本號(hào),而Pipfile.lock是包含包的具體的版本號(hào)的。如果不想產(chǎn)生Pipfile.lock文件,在安裝依賴包的時(shí)候,加上–skip-lock選項(xiàng)即可。
打開依賴包文件Pipefile,可以看到python_version = “3.7”,說(shuō)明這個(gè)項(xiàng)目是基于Python 3.7版本的。package部分列出來(lái)了項(xiàng)目的依賴包是bpytest = “*”,星號(hào)代表最新版本。
而Pipfile.lock是包含安裝的依賴包具體的版本號(hào),可以看到本次安裝的pytest是5.4.1版本,并且它的依賴包的版本也列出來(lái)了。
$ cat Pipfile.lock { "_meta": { "hash": { "sha256": "828b8ad012f4c8773e6e61e3ac2be0ffcd7540fd7ed175a8355676c8e31c4d3d" }, "pipfile-spec": 6, "requires": { "python_version": "3.7" }, "sources": [ { "name": "pypi", "url": "https://pypi.org/simple", "verify_ssl": true } ] }, "default": { "attrs": { "hashes": [ "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" ], "version": "==19.3.0" }, "importlib-metadata": { "hashes": [ "sha256:2a688cbaa90e0cc587f1df48bdc97a6eadccdcd9c35fb3f976a09e3b5016d90f", "sha256:34513a8a0c4962bc66d35b359558fd8a5e10cd472d37aec5f66858addef32c1e" ], "markers": "python_version < '3.8'", "version": "==1.6.0" }, "more-itertools": { "hashes": [ "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c", "sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507" ], "version": "==8.2.0" }, "packaging": { "hashes": [ "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" ], "version": "==20.3" }, "pluggy": { "hashes": [ "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" ], "version": "==0.13.1" }, "py": { "hashes": [ "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa", "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0" ], "version": "==1.8.1" }, "pyparsing": { "hashes": [ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], "version": "==2.4.7" }, "pytest": { "hashes": [ "sha256:0e5b30f5cb04e887b91b1ee519fa3d89049595f428c1db76e73bd7f17b09b172", "sha256:84dde37075b8805f3d1f392cc47e38a0e59518fb46a431cfdaf7cf1ce805f970" ], "index": "pypi", "version": "==5.4.1" }, "six": { "hashes": [ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" ], "version": "==1.14.0" }, "wcwidth": { "hashes": [ "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1", "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1" ], "version": "==0.1.9" }, "zipp": { "hashes": [ "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b", "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96" ], "version": "==3.1.0" } }, "develop": {} }
3.2 提高依賴包安裝速度
在使用pipenv的時(shí)候,常常會(huì)安裝過(guò)程比較慢,通過(guò)加上 -v 參數(shù),可以看到安裝過(guò)程中的步驟信息,卡在了下載那里,這時(shí)應(yīng)該可以意識(shí)到是因?yàn)榫W(wǎng)絡(luò)的原因,pipenv創(chuàng)建的 Pipfile 中默認(rèn)的Pypi源是python官方的 https://pypi.python.org/simple。我們國(guó)內(nèi)用戶訪問(wèn)下載的時(shí)候會(huì)很慢。
如果想通過(guò)Pypi的國(guó)內(nèi)鏡像安裝依賴包,可以在安裝軟件包時(shí),指定–pypi-mirror,比如通過(guò)清華大學(xué)鏡像安裝flask軟件包:
$ pipenv install --pypi-mirror https://pypi.tuna.tsinghua.edu.cn/simple flask
為了避免每次都要指定–pypi-mirror,我一般會(huì)在創(chuàng)建好Pipfile以后,將文件中 source 塊下的 url 字段,設(shè)置為國(guó)內(nèi)的 pypi 源,我推薦的是清華的Pypi源或者阿里源,具體設(shè)置如下:
[[source]] url = "https://pypi.tuna.tsinghua.edu.cn/simple" verify_ssl = true name = "pypi"
3.3 刪除依賴包
如果是要?jiǎng)h除虛擬環(huán)境中的第三方包,執(zhí)行
$ pipenv uninstall pytest
3.4 安裝項(xiàng)目所有的依賴包
用git管理項(xiàng)目時(shí)候,要把Pipfile和Pipfile.lock加入版本跟蹤。這樣clone了這個(gè)項(xiàng)目的同學(xué),只需要執(zhí)行
$ pipenv install
就可以安裝所有的Pipfile中 [packages]部分列出來(lái)的包了,并且自動(dòng)為項(xiàng)目在自己電腦上創(chuàng)建了虛擬環(huán)境。
3.5 安裝pipefile.lock中的依賴包
上面的方法都是安裝Pipfile中列出來(lái)的第三方包的最新版本,如果是想安裝Pipfile.lock中固定版本的第三方依賴包,需要執(zhí)行:
$ pipenv install --ignore-pipfile
3.6 安裝requirements.txt里面的依賴包
如果項(xiàng)目之前使用requirements.txt來(lái)管理依賴的,那么使用pipenv安裝所有依賴可以采用類似pip的方法:
$ pipenv install -r requirements.txt
04 — 使用虛擬環(huán)境進(jìn)行開發(fā)
虛擬環(huán)境創(chuàng)建好了之后,就可以在里面進(jìn)行開發(fā)了。
如果在命令行下開發(fā),則在項(xiàng)目目錄下執(zhí)行pipenv shell,就進(jìn)入到了虛擬環(huán)境中,在這個(gè)環(huán)境中,已經(jīng)包含安裝過(guò)的所有依賴包了,接下來(lái)就可以利用這些依賴包進(jìn)行開發(fā)工作了。
$ pipenv shell Launching subshell in virtual environment… bash-3.2$ . /Users/chunming.liu/.local/share/virtualenvs/pipenv_demo-RYMSREda/bin/activate (pipenv_demo) bash-3.2$ python Python 3.7.7 (default, Apr 12 2020, 12:31:11) [Clang 11.0.0 (clang-1100.0.33.17)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import pytest >>>
如果是用Pycharm進(jìn)行開發(fā),就更簡(jiǎn)單了,直接用Pycharm打開項(xiàng)目即可。可以從Pycharm中的左側(cè)導(dǎo)航欄里面看到External Libraries顯示的是虛擬環(huán)境中的Python解釋器了。
在虛擬環(huán)境中執(zhí)行開發(fā)好的程序,有兩種方式,一種是前面提到的先執(zhí)行pipenv shell進(jìn)入到虛擬環(huán)境后,再執(zhí)行python程序;另一種方式,則是執(zhí)行pyenv run,比如在虛擬環(huán)境中執(zhí)行基于pytest框架編寫的測(cè)試用例,只需要執(zhí)行下面的命令即可:
$ pipenv run py.test
04 — 總結(jié)
本文給大家介紹了如何使用pyenv安裝多個(gè)版本Python,如何在不同的Python版本間切換。還介紹了一種Python官方推薦使用的包管理工具pipenv,它結(jié)合pyenv和pip和virtualenv的優(yōu)點(diǎn)于一身,可以幫我們管理項(xiàng)目的虛擬環(huán)境、管理項(xiàng)目的依賴包。
在這里插入圖片描述
非常建議大家嘗試一下pyenv和pipenv。在實(shí)踐中,推薦大家將Pipfile和Pipfile.lock加入版本跟蹤,不要將虛擬環(huán)境.venv加入版本管理,因?yàn)檫@個(gè)包比較大,而且可以pipenv install方式重建。為每一個(gè)項(xiàng)目項(xiàng)目建立獨(dú)立的虛擬環(huán)境,為每一個(gè)項(xiàng)目使用Pipfile管理依賴是一個(gè)非常好的實(shí)踐。
參考資料
https://github.com/pyenv/pyenv
https://github.com/pypa/pipenv
https://packaging.python.org/tutorials/managing-dependencies/#installing-pipenv
https://hackersandslackers.com/pipenv-python-environment-management/
到此這篇關(guān)于利用pipenv和pyenv管理多個(gè)相互獨(dú)立的Python虛擬開發(fā)環(huán)境的文章就介紹到這了,更多相關(guān)pipenv和pyenv管理多Python虛擬環(huán)境內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- pyenv虛擬環(huán)境管理python多版本和軟件庫(kù)的方法
- python pyenv多版本管理工具的使用
- python多環(huán)境切換及pyenv使用過(guò)程詳解
- pyenv與virtualenv安裝實(shí)現(xiàn)python多版本多項(xiàng)目管理
- 對(duì)Python 兩大環(huán)境管理神器 pyenv 和 virtualenv詳解
- 詳解pyenv下使用python matplotlib模塊的問(wèn)題解決
- 詳解使用 pyenv 管理多個(gè)版本 python 環(huán)境
- pyenv命令管理多個(gè)Python版本
- Python使用pyenv實(shí)現(xiàn)多環(huán)境管理
相關(guān)文章
使用Matplotlib創(chuàng)建漂亮的數(shù)據(jù)可視化圖表
在 Python 中,Matplotlib 是一個(gè)強(qiáng)大而靈活的工具,可以用來(lái)創(chuàng)建各種類型的數(shù)據(jù)可視化圖表,本文給大家介紹了如何使用Matplotlib創(chuàng)建漂亮的數(shù)據(jù)可視化圖表,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-04-04python實(shí)現(xiàn)圖片轉(zhuǎn)字符小工具
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片轉(zhuǎn)字符小工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04python 解決pycharm運(yùn)行py文件只有unittest選項(xiàng)的問(wèn)題
這篇文章主要介紹了python 解決pycharm運(yùn)行py文件只有unittest選項(xiàng)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09python 進(jìn)制轉(zhuǎn)換 int、bin、oct、hex的原理
這篇文章主要介紹了python 進(jìn)制轉(zhuǎn)換 int、bin、oct、hex的原理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01opencv+mediapipe實(shí)現(xiàn)人臉檢測(cè)及攝像頭實(shí)時(shí)示例
本文主要介紹了opencv+mediapipe實(shí)現(xiàn)人臉檢測(cè)及攝像頭實(shí)時(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Django debug為True時(shí),css加載失敗的解決方案
這篇文章主要介紹了Django debug為True時(shí),css加載失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04