您好,登錄后才能下訂單哦!
Python的虛擬環(huán)境極大地方便了人們的生活。本指南先介紹虛擬環(huán)境的基礎(chǔ)知識(shí)以及使用方法,然后再深入介紹虛擬環(huán)境背后的工作原理。
注意:本指南在macOS Mojave系統(tǒng)上使用最新版本的Python 3.7.x。
1. 為什么使用虛擬環(huán)境?
虛擬環(huán)境為一系列潛在問(wèn)題提供簡(jiǎn)單的解決方案,尤其是在以下幾個(gè)方面:
聽(tīng)起來(lái)很方便,不是嗎?開(kāi)始構(gòu)建更復(fù)雜的項(xiàng)目并與其他人協(xié)作時(shí),虛擬環(huán)境的重要性會(huì)凸顯出來(lái)。很多數(shù)據(jù)科學(xué)家也需要熟悉虛擬環(huán)境中與多語(yǔ)言相關(guān)的Conda環(huán)境。
可按照先后次序來(lái)使用!
2. 什么是虛擬環(huán)境?
到底什么是虛擬環(huán)境?
虛擬環(huán)境是用于依賴項(xiàng)管理和項(xiàng)目隔離的Python工具,允許Python站點(diǎn)包(第三方庫(kù))安裝在本地特定項(xiàng)目的隔離目錄中,而不是全局安裝(即作為系統(tǒng)范圍內(nèi)的Python的一部分)。
這聽(tīng)起來(lái)不錯(cuò),但到底什么是虛擬環(huán)境呢?虛擬環(huán)境只是一個(gè)包含三個(gè)重要組件的目錄:
最后一點(diǎn)在于會(huì)發(fā)生一些意想不到的錯(cuò)誤,稍后會(huì)講這一點(diǎn),但現(xiàn)在先看看在實(shí)際中如何實(shí)際使用虛擬環(huán)境。
3. 使用虛擬環(huán)境
(1) 創(chuàng)造虛擬環(huán)境
假設(shè)想要為正在處理的項(xiàng)目創(chuàng)建一個(gè)名為test-project/的虛擬環(huán)境,該項(xiàng)目具有以下目錄樹(shù):
test-project/ ├── data ├── deliver # Final analysis, code, & presentations ├── develop # Notebooks for exploratory analysis ├── src # Scripts & local project modules └── tests
需要執(zhí)行venv模塊,它是Python標(biāo)準(zhǔn)庫(kù)的一部分。
% cd test-project/ % python3 -m venv venv/ # Creates an environment called venv/
注意:可使用不同的環(huán)境名稱替換“venv/”。
瞧!虛擬環(huán)境誕生了?,F(xiàn)在項(xiàng)目變成:
test-project/ ├── data ├── deliver ├── develop ├── src ├── tests └── venv # There it is!
提醒:虛擬環(huán)境本身就是一個(gè)目錄。
唯一要做的事情是通過(guò)運(yùn)行前面提到的腳本來(lái)“激活”環(huán)境。
% source venv/bin/activate (venv) % # Fancy new command prompt
現(xiàn)在我們位于活動(dòng)的虛擬環(huán)境中(由命令提示符指示,前綴為活動(dòng)環(huán)境的名稱)。
我們會(huì)像往常一樣處理項(xiàng)目,確保項(xiàng)目與系統(tǒng)的其他部分完全隔離。在虛擬環(huán)境中,我們無(wú)法訪問(wèn)系統(tǒng)范圍的站點(diǎn)包,并且無(wú)法在虛擬環(huán)境之外訪問(wèn)安裝包。
完成項(xiàng)目工作時(shí),可以通過(guò)以下代碼退出環(huán)境:
(venv) % deactivate % # Old familiar command prompt
(2) 安裝包
默認(rèn)情況下,只在新環(huán)境中安裝pip和setuptools。
(venv) % pip list # Inside an active environmentPackage Version ---------- ------- pip 19.1.1 setuptools 40.8.0
如果想要安裝第三方庫(kù)的特定版本,比如numpyv1.15.3,可像往常一樣使用pip。
(venv) % pip install numpy==1.15.3 (venv) % pip listPackage Version ---------- ------- numpy 1.15.3 pip 19.1.1 setuptools 40.8.0
現(xiàn)在可在腳本或活動(dòng)的Python shell中導(dǎo)入numpy。例如,假設(shè)項(xiàng)目包含以下幾行腳本tests / imports-test.py。
#!/usr/bin/env python3 import numpy as np
直接從命令行運(yùn)行這個(gè)腳本時(shí),可得到:
(venv) % tests/imports-test.py (venv) % # Look, Ma, no errors!
成功。腳本導(dǎo)入numpy沒(méi)有故障。
4. 管理環(huán)境
(1) 需求文件
使我們的工作成果可被他人重新使用的最簡(jiǎn)單方法是在項(xiàng)目的根目錄(頂層目錄)中加入一個(gè)需求文件。為此,需要運(yùn)行pip freeze,以下列出已安裝的第三方軟件包及其版本號(hào):
(venv) % pip freeze numpy==1.15.3
并將輸出寫入文件,我們稱之為requirements.txt。
(venv) % pip freeze > requirements.txt
更新軟件包或安裝新軟件包時(shí),都可使用相同的命令重寫需求文件。
現(xiàn)在,任何共享項(xiàng)目的人都可以使用requirements.txt文件,通過(guò)復(fù)制環(huán)境以在系統(tǒng)上運(yùn)行項(xiàng)目。
(2) 復(fù)制環(huán)境
等等——究竟是怎么做到的?
想象一下,我們的隊(duì)友Sara從團(tuán)隊(duì)的GitHub存儲(chǔ)庫(kù)中刪除了測(cè)試項(xiàng)目。在她的系統(tǒng)上,項(xiàng)目的目錄樹(shù)如下所示:
test-project/ ├── data ├── deliver ├── develop ├── requirements.txt ├── src └── tests
注意到有點(diǎn)不尋常的東西了嗎?是的,沒(méi)錯(cuò)!沒(méi)有venv /文件夾。
我們已經(jīng)將它從團(tuán)隊(duì)的GitHub存儲(chǔ)庫(kù)中刪除,因?yàn)樗拇嬖诳赡軙?huì)引起麻煩。
這就是使用requirements.txt文件對(duì)復(fù)制項(xiàng)目代碼至關(guān)重要的一個(gè)原因。
要在機(jī)器上運(yùn)行測(cè)試項(xiàng)目,Sara需要做的就是在項(xiàng)目的根目錄中創(chuàng)建一個(gè)虛擬環(huán)境:
Sara% cd test-project/ Sara% python3 -m venv venv/
并使用pip install -r requirements.txt將項(xiàng)目的依賴項(xiàng)安裝在活動(dòng)的虛擬環(huán)境中。
Sara% source venv/bin/activate (venv) Sara% pip install -r requirements.txt Collecting numpy==1.15.3 (from -r i (line 1)) Installing collected packages: numpy Successfully installed numpy-1.15.3
現(xiàn)在,Sara系統(tǒng)上的項(xiàng)目環(huán)境與我們的系統(tǒng)完全相同。很整潔,不是嗎?
(3) 故障排除
可惜事情并不總是按計(jì)劃進(jìn)行,總會(huì)遇到一些問(wèn)題。也許錯(cuò)誤地更新了特定的站點(diǎn)包后發(fā)現(xiàn)自己處于Dependency Hell的第九級(jí),無(wú)法運(yùn)行單行項(xiàng)目代碼。也許它沒(méi)那么糟糕,可能你會(huì)發(fā)現(xiàn)自己竟處于第七級(jí)。
無(wú)論你發(fā)現(xiàn)自己處于何種程度,解決問(wèn)題并再次看到希望的最簡(jiǎn)單方法是重新創(chuàng)建項(xiàng)目的虛擬環(huán)境。
% rm -r venv/ # Nukes the old environment % python3 -m venv venv/ # Makes a blank new one % pip install -r requirements.txt # Re-installs
大功告成,多虧了requirements.txt文件,又恢復(fù)了正常。然而另一個(gè)原因是始終要在項(xiàng)目中列入需求文件。
5. 虛擬環(huán)境如何做到這一點(diǎn)?
想了解更多有關(guān)虛擬環(huán)境的信息嗎?比如,活動(dòng)環(huán)境如何使用正確的Python解釋程序并如何找到合適的第三方庫(kù)?
(1) echo $ PATH
這一切都?xì)w結(jié)為PATH的價(jià)值,它告訴shell使用什么Python實(shí)例以及在哪里尋找網(wǎng)站包。在基礎(chǔ)shell中,PATH看起來(lái)或多或少是這樣表現(xiàn)的。
% echo $PATH /usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin
調(diào)用Python解釋器或運(yùn)行.py腳本時(shí),shell會(huì)按順序搜索PATH中列出的目錄,直到遇到Python實(shí)例。要查看PATH首先找到的Python實(shí)例,請(qǐng)運(yùn)行which python3。
% which python3 /usr/local/bin/python3 # Your output may differ
通過(guò)站點(diǎn)模塊(這是Python標(biāo)準(zhǔn)庫(kù)的一部分)查找此Python實(shí)例查找站點(diǎn)包的位置也很容易。
% python3 # Activates a Python shell >>> import site >>> site.getsitepackages() # Points to site-packages folder['/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']
運(yùn)行腳本venv / bin / activate修改PATH,以便shell在搜索系統(tǒng)的全局二進(jìn)制文件之前搜索項(xiàng)目的本地二進(jìn)制文件。
% cd ~/test-project/ % source venv/bin/activate (ven) % echo $PATH~/test-project/venv/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin
現(xiàn)在shell知道如何使用項(xiàng)目的本地Python實(shí)例:
(venv) % which python3 ~/test-project/venv/bin/python3
在哪里可以找到項(xiàng)目的本地站點(diǎn)包?
(venv) % python3 >>> import site >>> site.getsitepackages()['~/test-project/venv/lib/python3.7/site-packages'] # Ka-ching
(2) 理智檢查
還記得以前的tests / imports-test.py腳本嗎?看起來(lái)是下面這樣:
#!/usr/bin/env python3 import numpy as np
我們能夠在活動(dòng)環(huán)境中運(yùn)行此腳本,不出現(xiàn)任何問(wèn)題,是因?yàn)榄h(huán)境中的Python實(shí)例能夠訪問(wèn)項(xiàng)目的本地站點(diǎn)包。
如果運(yùn)行從項(xiàng)目的虛擬環(huán)境外部而來(lái)的相同腳本會(huì)發(fā)生什么?
% tests/imports-test.py # Look, no active environmentTraceback (most recent call last): File "tests/imports-test.py", line 3, in <module> import numpy as npModuleNotFoundError: No module named 'numpy'
是的,出現(xiàn)了一個(gè)錯(cuò)誤,但我們應(yīng)該這樣做。如果我們不這樣做,那就意味著我們能夠從項(xiàng)目外部訪問(wèn)項(xiàng)目的本地站點(diǎn)包,從而破壞了擁有虛擬環(huán)境的整個(gè)目的。出現(xiàn)錯(cuò)誤的事實(shí)證明我們的項(xiàng)目與系統(tǒng)的其他部分完全隔離。
(3) 環(huán)境的目錄樹(shù)
有一件事可以幫助整理所有這些信息,即清楚地了解環(huán)境目錄樹(shù)的外觀。
test-project/venv/ # Our environment's root directory ├── bin │ ├── activate # Scripts to activate │ ├── activate.csh # our project's │ ├── activate.fish # virtual environment. │ ├── easy_install │ ├── easy_install-3.7 │ ├── pip │ ├── pip3 │ ├── pip3.7 │ ├── python -> /usr/local/bin/python # Symlinks to system-wide │ └── python3 -> python3.7 # Python instances. ├── include ├── lib │ └── python3.7 │ └── site-packages # Stores local site packages └── pyvenv.cfg
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。