代碼詳解:Python虛擬環境的原理及使用

2021-01-11 讀芯術

全文共5308字,預計學習時長20分鐘或更長

依附之門:「放棄進入這裡的所有希望。」

插圖:Gustave Doré

Python的虛擬環境極大地方便了人們的生活。本指南先介紹虛擬環境的基礎知識以及使用方法,然後再深入介紹虛擬環境背後的工作原理。

注意:本指南在macOS Mojave系統上使用最新版本的Python 3.7.x。

目錄

· 為什麼使用虛擬環境?

· 什麼是虛擬環境?

· 使用虛擬環境

· 管理環境

· 虛擬環境如何運行?

1. 為什麼使用虛擬環境?

虛擬環境為一系列潛在問題提供簡單的解決方案,尤其是在以下幾個方面:

· 允許不同的項目使用不同版本的程序包,從而解決依賴性問題。例如,可以將Project A v2.7用於Project X,並將Package A v1.3用於Project Y。

· 通過捕獲需求文件中的所有包依賴項,使項目自包含且可重現。

· 在沒有管理員權限的主機上安裝軟體包。

· 只需要一個項目,無需在系統範圍內安裝軟體包,就能保持全局site-packages /目錄整潔。

聽起來很方便,不是嗎?開始構建更複雜的項目並與其他人協作時,虛擬環境的重要性會凸顯出來。很多數據科學家也需要熟悉虛擬環境中與多語言相關的Conda環境。

可按照先後次序來使用!

2. 什麼是虛擬環境?

到底什麼是虛擬環境?

虛擬環境是用於依賴項管理和項目隔離的Python工具,允許Python站點包(第三方庫)安裝在本地特定項目的隔離目錄中,而不是全局安裝(即作為系統範圍內的Python的一部分)。

這聽起來不錯,但到底什麼是虛擬環境呢?虛擬環境只是一個包含三個重要組件的目錄:

· 安裝了第三方庫的site-packages /文件夾。

· 系統上安裝的Python可執行文件的symlink符號連結。

· 確保執行Python代碼的腳本使用在給定虛擬環境中安裝的Python解釋器和站點包。

最後一點在於會發生一些意想不到的錯誤,稍後會講這一點,但現在先看看在實際中如何實際使用虛擬環境。

但丁《神曲·地獄篇》第六章—維吉爾安撫Cerberus

插圖:Gustave Doré

3. 使用虛擬環境

創造虛擬環境

假設想要為正在處理的項目創建一個名為test-project/的虛擬環境,該項目具有以下目錄樹:

test-project/

├── data ├── deliver # Final analysis, code, & presentations├── develop # Notebooks for exploratory analysis├── src # Scripts & local project modules└── tests

需要執行venv模塊,它是Python標準庫的一部分。

% cd test-project/% python3 -m venv venv/ # Creates an environment called venv/

注意:可使用不同的環境名稱替換「venv/」。

瞧!虛擬環境誕生了。現在項目變成:

test-project/├── data ├── deliver ├── develop ├── src ├── tests └── venv # There it is!

提醒:虛擬環境本身就是一個目錄。

唯一要做的事情是通過運行前面提到的腳本來「激活」環境。

% source venv/bin/activate

(venv) % # Fancy new command prompt

現在我們位於活動的虛擬環境中(由命令提示符指示,前綴為活動環境的名稱)。

我們會像往常一樣處理項目,確保項目與系統的其他部分完全隔離。在虛擬環境中,我們無法訪問系統範圍的站點包,並且無法在虛擬環境之外訪問安裝包。

完成項目工作時,可以通過以下代碼退出環境:

(venv) % deactivate

% # Old familiar command prompt

安裝包

默認情況下,只在新環境中安裝pip和setuptools。

(venv) % pip list # Inside an active environmentPackage Version

--pip 19.1.1setuptools 40.8.0

如果想要安裝第三方庫的特定版本,比如numpyv1.15.3,可像往常一樣使用pip。

(venv) % pip install numpy==1.15.3

(venv) % pip listPackage Version --numpy 1.15.3pip 19.1.1setuptools 40.8.0

現在可在腳本或活動的Python shell中導入numpy。例如,假設項目包含以下幾行腳本tests / imports-test.py。

#!/usr/bin/env python3

import numpy as np

直接從命令行運行這個腳本時,可得到:

(venv) % tests/imports-test.py

(venv) % # Look, Ma, no errors!

成功。腳本導入numpy沒有故障。

但丁和Virgil穿過Styx河—但丁《神曲·地獄篇》第八章

插圖:Gustave Doré

4. 管理環境

需求文件

使我們的工作成果可被他人重新使用的最簡單方法是在項目的根目錄(頂層目錄)中加入一個需求文件。為此,需要運行pip freeze,以下列出已安裝的第三方軟體包及其版本號:

(venv) % pip freeze

numpy==1.15.3

並將輸出寫入文件,我們稱之為requirements.txt。

(venv) % pip freeze > requirements.txt

更新軟體包或安裝新軟體包時,都可使用相同的命令重寫需求文件。

現在,任何共享項目的人都可以使用requirements.txt文件,通過複製環境以在系統上運行項目。

複製環境

等等——究竟是怎麼做到的?

想像一下,我們的隊友Sara從團隊的GitHub存儲庫中刪除了測試項目。在她的系統上,項目的目錄樹如下所示:

test-project/

├── data ├── deliver ├── develop ├── requirements.txt├── src └── tests

注意到有點不尋常的東西了嗎?是的,沒錯!沒有venv /文件夾。

我們已經將它從團隊的GitHub存儲庫中刪除,因為它的存在可能會引起麻煩。這就是使用requirements.txt文件對複製項目代碼至關重要的一個原因。

要在機器上運行測試項目,Sara需要做的就是在項目的根目錄中創建一個虛擬環境:

Sara% cd test-project/

Sara% python3 -m venv venv/

並使用pip install -r requirements.txt將項目的依賴項安裝在活動的虛擬環境中。

Sara% source venv/bin/activate

(venv) Sara% pip install -r requirements.txtCollecting numpy==1.15.3 (from -r i (line 1))Installing collected packages: numpySuccessfully installed numpy-1.15.3

現在,Sara系統上的項目環境與我們的系統完全相同。很整潔,不是嗎?

故障排除

可惜事情並不總是按計劃進行,總會遇到一些問題。也許錯誤地更新了特定的站點包後發現自己處於Dependency Hell的第九級,無法運行單行項目代碼。也許它沒那麼糟糕,可能你會發現自己竟處於第七級。

無論你發現自己處於何種程度,解決問題並再次看到希望的最簡單方法是重新創建項目的虛擬環境。

% rm -r venv/ # Nukes the old environment% python3 -m venv venv/ # Makes a blank new one% pip install -r requirements.txt # Re-installs dependencies

大功告成,多虧了requirements.txt文件,又恢復了正常。然而另一個原因是始終要在項目中列入需求文件。

但丁與冰中的叛徒對話——但丁《神曲·地獄篇》第32章 插圖:Gustave Doré

5. 虛擬環境如何做到這一點?

想了解更多有關虛擬環境的信息嗎?比如,活動環境如何使用正確的Python解釋程序並如何找到合適的第三方庫?

echo $ PATH

這一切都歸結為PATH的價值,它告訴shell使用什麼Python實例以及在哪裡尋找網站包。在基礎shell中,PATH看起來或多或少是這樣表現的。

% echo $PATH/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin

調用Python解釋器或運行.py腳本時,shell會按順序搜索PATH中列出的目錄,直到遇到Python實例。要查看PATH首先找到的Python實例,請運行which python3。

% which python3/usr/local/bin/python3 # Your output may differ

通過站點模塊(這是Python標準庫的一部分)查找此Python實例查找站點包的位置也很容易。

% 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']

運行腳本venv / bin / activate修改PATH,以便shell在搜索系統的全局二進位文件之前搜索項目的本地二進位文件。

% cd ~/test-project/

% source venv/bin/activate(ven) % echo $PATH~/test-project/venv/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin

現在shell知道如何使用項目的本地Python實例:

(venv) % which python3

~/test-project/venv/bin/python3

在哪裡可以找到項目的本地站點包?

(venv) % python3

>>> import site>>> site.getsitepackages()['~/test-project/venv/lib/python3.7/site-packages'] # Ka-ching

理智檢查

還記得以前的tests / imports-test.py腳本嗎?看起來是下面這樣:

#!/usr/bin/env python3

import numpy as np

我們能夠在活動環境中運行此腳本,不出現任何問題,是因為環境中的Python實例能夠訪問項目的本地站點包。

如果運行從項目的虛擬環境外部而來的相同腳本會發生什麼?

% 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'

是的,出現了一個錯誤,但我們應該這樣做。如果我們不這樣做,那就意味著我們能夠從項目外部訪問項目的本地站點包,從而破壞了擁有虛擬環境的整個目的。出現錯誤的事實證明我們的項目與系統的其他部分完全隔離。

環境的目錄樹

有一件事可以幫助整理所有這些信息,即清楚地了解環境目錄樹的外觀。

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

但丁和維吉爾回到了人世間——但丁《神曲·地獄篇》第34章 插圖:Gustave Doré

留言 點讚 關注

我們一起分享AI學習與發展的乾貨

歡迎關注全平臺AI垂類自媒體 「讀芯術」

相關焦點

  • python入門基礎之lambda匿名函數詳解
    python入門基礎之lambda匿名函數詳解剛開始學習python的時候很多人可能對於lambda函數不了解,感覺和def很混亂,下面我來介紹一下lambda函數我從一下幾個方面來介紹lambda:lambda作為一個表達式,定義了一個匿名函數,上例的代碼x,y為入口參數,x+y為函數體。在這裡lambda簡化了函數定義的書寫形式。python允許用lambda關鍵字創造匿名函數。匿名是不需要以標準的方式來聲明,比如說使用 def 語句。(除非賦值給一個局部變量,這樣的對象也不會在任何的名字空間內創建名字,上面的例子中會創建名字。)
  • python環境配置簡要流程
    \用戶名 目錄下修改 Anaconda 配置文件 .condarc,將 -defaults 這一行刪掉即可 5、版本對應關係 首先明白各個版本對應關係: https://docs.floydhub.com/guides/environments/ 6、創建虛擬環境
  • windows上python開發環境的搭建
    對於程序開發而言,需要的就是一個良好的開發環境。對於C,C++, java等靜態性語言而言,需要通過IDE(集成開發環境)來便利開發過程;對於perl, python這種動態性語言而言,其開發環境的搭建就顯得簡單多了,只需要安裝好對應的解釋器,以及選擇一個順手的編輯器即可。
  • 如何使用python語言代碼實現判斷是否為回文
    工具Visual Studio 2019python運行環境技術python回文回文,是按照中心對稱,從左到右或從右到左,字符串都一樣的。如果想要python語言代碼實現回文判斷,若為回文,列印回文,否則列印不是回文。
  • Python OpenCV使用攝像頭捕獲視頻
    我們知道,OpenCV是一款強大的跨平臺的計算機視覺庫,使用它能完成我們對於圖像和視頻處理的很多功能,今天,我們使用OpenCV來捕獲計算機攝像頭的視頻。它的原理基本上就是通過獲取視頻中的一系列禎來實現對於視頻的各種操作。
  • 代碼詳解:Python正則表達式的終極使用指南
    但如果有re模塊,則只需兩行代碼:import repattern = r"[;.,–]"print(len(re.findall(pattern,string)))-19本文討論的是最常用的正則表達式模式,以及一些經常使用的正則表達式函數。什麼是正則表達式?
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    共4天8節,講解機器學習和深度學習的模型理論和代碼實踐,梳理機器學習、深度學習、計算機視覺的技術框架,從根本上解決如何使用模型、優化模型的問題;每次課中,首先闡述算法理論和少量公式推導,然後使用真實數據做數據挖掘、機器學習、深度學習的數據分析、特徵選擇、調參和結果比較。
  • Python の在 VSCode 中使用 IPython Kernel 的方法
    本文介紹,在 VSCode 使用 IPython Kernel,的設置方法。要達到的效果:只需按下 Ctrl+;,選中的幾行代碼,就會自動發送到 IPython Kernel,並運行,得到結果!當然,快捷鍵也可以另行設置!
  • gRPC Python 入門到生產環境
    相比在使用Restful方式完成服務之間的相互訪問,GRPC能提供更好的性能,更低的延遲,並且生來適合與分布式系統。同時基於標準化的IDL(ProtoBuf)來生成伺服器端和客戶端代碼, ProtoBuf服務定義可以作為服務契約,因此可以更好的支持團隊與團隊之間的接口設計,開發,測試,協作等等。
  • python基礎教程之python是什麼?
    這是最近10年最常用的10種程式語言的變化圖:python是什麼--python的功能總的來說,這幾種程式語言各有千秋。高級程式語言通常都會提供一個比較完善的基礎代碼庫,讓你能直接調用,比如,針對電子郵件協議的SMTP庫,針對桌面環境的GUI庫,在這些已有的代碼庫的基礎上開發,一個電子郵件客戶端幾天就能開發出來。Python就為我們提供了非常完善的基礎代碼庫,覆蓋了網絡、文件、GUI、資料庫、文本等大量內容,被形象地稱作「內置電池(batteries included)」。
  • 原理+代碼|Python實戰多元線性回歸模型
    其中多元共線性這個問題將貫穿所有的機器學習模型,所以本文會「將原理知識穿插於代碼段中」,爭取以不一樣的視角來敘述和講解「如何更好的構建和優化多元線性回歸模型」。原理其實非常簡單,將無法直接用於建模的名義變量轉換成可放入模型的虛擬變量的核心就短短八個字:「四散拆開,非此即彼」。下面用一個只有 4 行的微型數據集輔以說明。
  • Python初學者請注意!別這樣直接運行python命令
    尤其是一些初學者將網上的Python軟體包、代碼下載的到本地~/Downloads文件夾後,就直接在此路徑下運行python命令,這樣做會給電腦帶來極大的隱患。別再圖方便了為何這樣做會有危險?但是,有些人並不喜歡直接使用pip,而是更喜歡調用/path/to/python -m pip。這樣做的好處是可以避免環境變量$PATH設置的複雜性,而且對於Windows用戶來說,也可以避免處理安裝各種exe腳本和文檔。所以問題就來了,如果你的下載文件中有一個叫做pip.py的文件,那麼你將它將取代系統自帶的pip,接管你的程序。
  • 使用一行Python代碼從圖像讀取文本
    雖然圖像分類和涉及到一定程度計算機視覺的任務可能需要大量的代碼和紮實的理解,但是從格式良好的圖像中讀取文本在Python中卻是簡單的,並且可以應用於許多現實生活中的問題。在今天的帖子中,我想證明這一點。雖然會安裝一些庫,但不會花很多時間。
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    其實某個特定程序(無論使用何種程式語言)的運行速度是快還是慢,在很大程度上取決於編寫該程序的開發人員自身素質,以及他們編寫優化而高效代碼的能力。Medium上一位小哥就詳細講了講如何讓python提速30%,以此證明代碼跑得慢不是python的問題,而是代碼本身的問題。
  • Python每天一分鐘:lambda表達式 (匿名函數)及用法詳解
    lambda 表達式必須使用 lambda 關鍵字定義。一個lambda表達式範例本例中使用了多種python的小技巧,包括python推導式,map函數,lambda表達式等。總結相比之下,python中函數比 lambda 表達式具有更強的功能和適應性,lambda 表達式只是函數體為一行代碼的函數簡寫,因此其創建的只是簡單的函數對象。
  • Python代碼性能調試和優化
    詳細性能分析cProfile性能分析另一個常用的方法是使用cProfile,它可以提供很多性能信息python3 -m cProfile -s time performance.py例子中,我們使用了cProfile模塊和time參數運行測試腳本,以便按內部時間(cumtime)對行進行排序。
  • iOS10不越獄怎麼使用虛擬定位?iPhone7不越獄怎麼使用虛擬定位?
    iOS10不越獄怎麼使用虛擬定位?iPhone7不越獄怎麼使用虛擬定位?不過人的智慧是無窮的,今天小編就為大家介紹一個方法去開啟虛擬定位,無需越獄也可以做到哦。這個方法的原理是通過修改備份數據裡的地圖數據,使自帶地圖增加一個虛擬定位的按鈕來實現這項功能。iOS 9 和 iOS 10 都可以使用這個方法,iOS 7 系統則略有不同。1.
  • 使用Python進行VNC身份驗證檢查
    在本文中將描述了一個小的python腳本,該腳本可用於確定VNC伺服器上使用的身份驗證類型。它使用Scapy數據包處理程序來執行所有網絡數據傳輸和檢索。該程序可能並不完美,但是經過有限的測試,它似乎可以正常運行。為了了解程序的工作原理,我需要解釋VNC客戶端如何與VNC伺服器交互。RFB協議用於建立與伺服器的連接。
  • python之OS模塊39個常用函數詳解
    os.chdir('C:/Users/wuzhengxiang/Desktop/Python知識點總結')os.getcwd()#文件夾和文件同時命名os.renames("test/Python 63個內置函數詳解.py","test2/內置函數詳解.py")os.listdir()['kaggle','test2