Python/ target=_blank class=infotextkey>Python中的虛擬環(huán)境
虛擬環(huán)境是獨(dú)立的Python環(huán)境,有自己的site-packages。基本上,這意味著每個(gè)虛擬環(huán)境都有自己的一組對(duì)第三方軟件包的依賴。
如果在同一臺(tái)機(jī)器上開(kāi)發(fā)多個(gè)Python項(xiàng)目,虛擬環(huán)境會(huì)很有幫助。此外,當(dāng)你將Python代碼分發(fā)給其他人或在服務(wù)器上時(shí),虛擬環(huán)境非常方便,可以重現(xiàn)地創(chuàng)建與開(kāi)發(fā)機(jī)器上相同的環(huán)境。
今天,我們將學(xué)習(xí)
- 有哪些工具可以創(chuàng)建隔離的環(huán)境
- 哪些工具有助于Python項(xiàng)目中的包管理
創(chuàng)建虛擬環(huán)境
在Python的生態(tài)系統(tǒng)中創(chuàng)建虛擬環(huán)境有兩種常見(jiàn)的方法:virtualenv和venv .
venv
venv是用Python創(chuàng)建虛擬環(huán)境的最流行的選擇。從Python 3.3開(kāi)始venv是標(biāo)準(zhǔn)庫(kù)的一部分,因此一般在安裝了Python后才可用。但是,基于Debian的linux發(fā)行版要求要安裝python3-venv,因?yàn)樗麄兊木S護(hù)者決定將這個(gè)模塊從核心Python安裝中分離出來(lái)。
使用創(chuàng)建虛擬環(huán)境venv可以從鍵入以下內(nèi)容開(kāi)始
python -m venv venv
該命令在當(dāng)前的文件夾中創(chuàng)建一個(gè)名為venv的文件。現(xiàn)在,要使用這個(gè)新的虛擬環(huán)境,必須使用以下命令激活它:
source venv/bin/activate # Use this command on bash
.venvScriptsactivate # On windows
啟動(dòng)Python解釋器并鍵入
>>> import sys
>>> sys.executable
'/Users/bas/Code/tmp/venv/bin/python'
>>> for path in sys.path:
... print(repr(path))
...
''
'/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python39.zip'
'/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9'
'/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload'
'/Users/bas/Code/tmp2/venv/lib/python3.9/site-packages'
>>>
剛剛啟動(dòng)的Python解釋器位于你的虛擬環(huán)境中。此外site-packages目錄(pip安裝包所在的位置)指向虛擬環(huán)境中的一個(gè)路徑。
virtualenv
virtualenv 工作原理相似。要使用它,必須首先通過(guò)pip安裝它:
pip install virtualenv
然后可以
python -m virtualenv venv
請(qǐng)注意,只是將模塊的名稱從venv到virtualenv(第一個(gè)論點(diǎn))。這venv目標(biāo)文件夾保持不變。virtualenv將創(chuàng)建一個(gè)類似于venv以前有過(guò)。需要以與之前完全相同的方式激活新的虛擬環(huán)境:
source venv/bin/activate # On bash
virtualenv和...相對(duì)venv
你可能想知道這兩種工具有什么不同。
首先,virtualenv有更長(zhǎng)的歷史。它已經(jīng)在Python 2時(shí)代被使用了。直到3.3版,Python才加入了對(duì)虛擬環(huán)境的官方支持PEP 405 .
作為第三方軟件包,virtualenv具有獨(dú)立于系統(tǒng)Python安裝的額外優(yōu)勢(shì),因此可以獨(dú)立升級(jí)。
然而,使用的最大好處是virtualenv代替venv它允許針對(duì)除系統(tǒng)Python之外的Python版本。如果只安裝了Python 3.9,可以使用virtualenv用Python 3.10創(chuàng)建一個(gè)虛擬環(huán)境(當(dāng)然反之亦然)。你不僅可以使用任何想要的受支持的Python版本,還可以在沒(méi)有root或者Administrator權(quán)限,因?yàn)榘惭b是在你的工作目錄中完成的。
另一方面,使用virtualenv更加復(fù)雜。這是因?yàn)樗目鏟ython支持(甚至Python 2仍然支持)使得包和內(nèi)部的發(fā)現(xiàn)有點(diǎn)復(fù)雜,并且引導(dǎo)過(guò)程需要定制。如果你對(duì)這些內(nèi)幕感興趣,伯納特·加博的歐洲Python 2019演講涵蓋了這些見(jiàn)解。
總而言之:
|
venv |
virtualenv |
贊成的意見(jiàn) |
|
|
面向連接的網(wǎng)絡(luò)服務(wù)(Connection Oriented.NETwork Service) |
|
|
安裝軟件包
既然我們已經(jīng)有了一個(gè)可以工作的虛擬環(huán)境virtualenv或者venv,我們可以開(kāi)始安裝我們需要安裝的包,以滿足我們項(xiàng)目的依賴性。
pip
pip 是在Python中安裝包的事實(shí)上的標(biāo)準(zhǔn),并且從Python 3.4版開(kāi)始就是標(biāo)準(zhǔn)庫(kù)的一部分。
要安裝軟件包,只需輸入
pip install django
pip負(fù)責(zé)在PyPI上查找包并管理它的依賴項(xiàng)。在我們的示例中,我們可以通過(guò)上面的命令檢查哪些包已經(jīng)安裝:
$ pip list
Package Version
---------- -------
asgiref 3.5.0
Django 4.0.2
pip 21.1.3
setuptools 57.0.0
sqlparse 0.4.2
這樣,pip已安裝asgiref和sqlparse .
共享構(gòu)建環(huán)境的最常見(jiàn)方式是pip是通過(guò)創(chuàng)建一個(gè)requirements.txt看起來(lái)像這樣的文件:
django==4.0.2
問(wèn)題是pip它負(fù)責(zé)安裝依賴項(xiàng),但不負(fù)責(zé)安裝后的依賴項(xiàng)。例如,如果你安裝了django隨著pip它將安裝sqlparse和asgiref給你的。但是,如果卸載django之后,這兩個(gè)額外的包將被保留,不會(huì)被刪除。隨著時(shí)間的推移,你可能會(huì)忘記項(xiàng)目真正需要的包,以及那些只是以前安裝的包的剩余部分。當(dāng)你在項(xiàng)目的生命周期中從一個(gè)PyPI模塊遷移到另一個(gè)模塊時(shí),這種情況尤其適用。
pip也不區(qū)分開(kāi)發(fā)和生產(chǎn)環(huán)境。因此,可能需要訪問(wèn)開(kāi)發(fā)人員工具,例如black或者pytest開(kāi)發(fā)期間。在生產(chǎn)服務(wù)器上安裝這些軟件,往好里說(shuō)是不必要的,往壞里說(shuō)是有害的。
此外,當(dāng)兩個(gè)第三方包有沖突的依賴關(guān)系時(shí),pip沒(méi)有提供解決這些問(wèn)題的方法。
最后,管理你的requirements.txt不被照顧pip。一些開(kāi)發(fā)人員只是使用pip freeze > requirements.txt每當(dāng)安裝了新的依賴項(xiàng)時(shí)。然而,這是不可取的,因?yàn)樗鼘ㄗ右蕾嚕瑥亩鴲夯鲜鰡?wèn)題。
pipenv
pipenv 是由創(chuàng)建的工具肯尼斯·雷茨。最顯著的區(qū)別是pip那是pipenv旨在自動(dòng)跟蹤已安裝的軟件包。為此,pipenv創(chuàng)建兩個(gè)文件,Pipfile和Pipfile.lock .
pipenv解決以下問(wèn)題pip上面提到過(guò):
依賴性管理
安裝軟件包會(huì)自動(dòng)更新Pipfile還有Pipfile.lock
當(dāng)我們安裝時(shí)django隨著pipenv,它將安裝sqlparse和asgiref對(duì)我們來(lái)說(shuō)就像pip會(huì)的。然而,如果我們移除django從我們的要求來(lái)看,pipenv也將刪除這些額外的依賴項(xiàng)。
生產(chǎn)/開(kāi)發(fā)依賴性
一些依賴項(xiàng),比如linters或者測(cè)試工具,只在開(kāi)發(fā)環(huán)境中需要。這就是原因pipenv支持--dev旗幟。在生產(chǎn)系統(tǒng)上復(fù)制環(huán)境時(shí),不會(huì)安裝使用此標(biāo)志安裝的軟件包。
虛擬環(huán)境
pipenv還可以為您創(chuàng)建和管理虛擬環(huán)境。在實(shí)踐中,這意味著你可以完全依賴pipenv創(chuàng)建項(xiàng)目環(huán)境,包括安裝指定的Python版本。
隨著命令
pipenv --python 3.10
可以使用特定版本的Python輕松創(chuàng)建一個(gè)全新的虛擬env。
poetry
poetry 是Python的一個(gè)新的非常有雄心的包管理器。它的目標(biāo)是為開(kāi)發(fā)者可能遇到的所有虛擬環(huán)境和包管理問(wèn)題提供一個(gè)解決方案。
有趣的是,poetry–不像pipenv–不是的保護(hù)傘下的“官方”產(chǎn)品包Python打包權(quán)威。但是,它依賴于一個(gè)名為pyproject.toml(而不是Pipfile和Pipfile.lock如同pipenv確實(shí))。這pyproject.toml規(guī)范具有“官方地位”人教版518 .
還有,poetry可用于管理虛擬環(huán)境和包,以及構(gòu)建和發(fā)布自己的Python包。
pyproject.toml
poetry依賴于pyproject.toml文件,如下所示:
[tool.poetry]
name = "poetry_tutorial_project"
# ...
[tool.poetry.dependencies]
python = "^3.10"
loguru = "*"
psutil = "*"
[tool.poetry.dev-dependencies]
pytest = "*"
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
[tool.poetry.scripts]
run = "wsgi:main"
該文件是唯一的配置文件poetry使用并包含關(guān)于依賴關(guān)系、構(gòu)建說(shuō)明和測(cè)試環(huán)境的所有信息。
虛擬環(huán)境和骨骼創(chuàng)建
這poetry new projectname命令創(chuàng)建了一個(gè)合理的項(xiàng)目結(jié)構(gòu):
/projectname
├── README.md
├── projectname
│ └── __init__.py
├── pyproject.toml
└── tests
├── __init__.py
└── test_projectname.py
可以添加依賴項(xiàng)
poetry add django
這--dev-dependency只能用于為開(kāi)發(fā)環(huán)境添加依賴項(xiàng)。
構(gòu)建并發(fā)布
poetry也可以負(fù)責(zé)構(gòu)建你的包并將其發(fā)布到PyPI。它取代了twine從這個(gè)意義上說(shuō)。這里有一個(gè)很好的指南使用poetry打包Python項(xiàng)目 .
pip和...相對(duì)pipenv和...相對(duì)poetry
|
pip |
pipenv |
poetry |
贊成的意見(jiàn) |
|
|
|
面向連接的網(wǎng)絡(luò)服務(wù)(Connection Oriented Network Service) |
|
|
|
值得一提的其他工具
virtualenvwrApper
virtualenvwrapper 是對(duì)的一組擴(kuò)展virtualenv .
該軟件包附帶了一些方便的CLI實(shí)用程序。最重要的是:
- mkvirtualenv:創(chuàng)建虛擬環(huán)境的快捷方式。而不是venv和virtualenv,虛擬環(huán)境由創(chuàng)建virtualenvwrapper不放在工作目錄中,而是放在$HOME目錄。虛擬環(huán)境是通過(guò)以下方式創(chuàng)建的mkvirtualenv projectenv .
- workon:因?yàn)関irtualenvwrapper在中央位置創(chuàng)建虛擬環(huán)境,激活是通過(guò)workon命令。無(wú)論 你當(dāng)前的工作目錄是什么,都可以運(yùn)行workon projectenv,它會(huì)自動(dòng)從你的$HOME目錄并激活它。
pyenv
pyenv 是管理的工具Python版本。除了我們到目前為止討論的工具之外,它對(duì)管理虛擬環(huán)境和包管理都沒(méi)有幫助。然而,pyenv當(dāng)然,與其他工具兼容。pyenv可以成為搭建開(kāi)發(fā)工作站的便捷幫手。它本身不依賴于Python本身,因此可以方便地使用它來(lái)設(shè)置不同的Python安裝root /Administrator權(quán)利。
要安裝特定版本的Python,請(qǐng)鍵入:
pyenv install 3.10
使用pyenv結(jié)合虛擬環(huán)境管理器pyenv-團(tuán)隊(duì)創(chuàng)建了一些插件:
- pyenv-virtualenv
- pyenv-virtualenvwrapper
已棄用:pyvenv
pyvenv(不要與混淆pyenv)是一個(gè)用于創(chuàng)建虛擬環(huán)境的腳本,它過(guò)去是Python 3附帶的。從Python 3.6開(kāi)始,它已被棄用,并被取代python -m venv .
硬幣指示器 (coin-levelindicator的縮寫(xiě))命令行界面(Command Line Interface for batch scripting)
有時(shí)候你只想使用PyPI的CLI工具。在這種情況下,不需要虛擬環(huán)境進(jìn)行開(kāi)發(fā),只需要管理 CLI工具。你每天使用的不同CLI工具都有自己的依賴關(guān)系,因此在系統(tǒng)Python中安裝這些工具可能會(huì)再次導(dǎo)致已知的問(wèn)題。因此,為每個(gè)CLI工具創(chuàng)建單獨(dú)的虛擬環(huán)境是有意義的。
為了使這一過(guò)程方便和易于管理,有一些工具可以做到這一點(diǎn):為CLI工具創(chuàng)建一個(gè)隔離的環(huán)境,然后運(yùn)行這些CLI工具。
pipx
隨著 pipx 您可以安裝公開(kāi)CLI腳本的軟件包。pipx將自動(dòng)為每個(gè)CLI工具創(chuàng)建一個(gè)單獨(dú)的虛擬環(huán)境,并將一個(gè)符號(hào)鏈接放入一個(gè)名為.local/bin在你的內(nèi)心$HOME目錄。
要從PyPI安裝CLI工具,只需鍵入:
$ pipx install pycowsay
installed package pycowsay 0.0.0.1, Python 3.9.6
These apps are now globally available
- pycowsay
done! :sparkles: :star2: :sparkles:
當(dāng)它被安裝后,你就神奇地在你的shell上擁有了CLI工具,并且它不會(huì)污染您系統(tǒng)的Python包。
$ pycowsay bas.codes
---------
< bas.codes >
---------
^__^
(oo)_______
(__) )/
||----w |
|| ||
pip-run
pip-run 與...的目的相同pipx。唯一的區(qū)別是pip-run不提供持久的軟件包安裝,而是在工具執(zhí)行后刪除所有環(huán)境。
$ pip-run -q pycowsay -- -m pycowsay "bas.codes"
---------
< bas.codes >
---------
^__^
(oo)_______
(__) )/
||----w |
|| ||
pip-run是一個(gè)很好的工具,因?yàn)樗梢詭湍闱謇怼I踔量梢允褂冒惭b的軟件包運(yùn)行交互式解釋器,這使得pip-run不僅對(duì)CLI工具有用,而且對(duì)研究PyPI中的模塊包也有用:
$ python -m pip-run -q boto
>>> import boto