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

2020-12-25 讀芯術

全文共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虛擬環境?吃貨們都能懂的教程,走起
    Python的虛擬環境電腦系統:windows10Python 版本:3.8(注意:python2使用virtualen命令新建虛擬環境,和python3不同,本文用的是python3)我們安裝過python環境以後,系統會在path路徑下面生成一個python的使用環境路徑,這就是我們python的默認python環境
  • 只需5分鐘就能get到的神器:python虛擬環境安裝&使用
    一、虛擬環境介紹◆ 什麼是虛擬環境:它是一個虛擬化,從電腦獨立開闢出來的python環境,可以把它看作一個容器,我們可以在這個容器(環境)中安裝我們項目中所依賴的相關模塊和包。◆ 為什麼要用到虛擬環境:在實際項目開發中,我們通常會根據自己的需求去下載各種相應的包和模塊,但是可能每個項目使用的框架庫並不一樣,或使用框架的版本不一樣。那麼在做不同項目的時候會很不方便,根據需要我們不斷的去卸載和安裝對應和模塊的包。
  • Python虛擬環境的搭建(Linux篇)
    創建虛擬環境(執行以下命令,將在當前目錄下創建「虛擬環境名稱" 的虛擬環境文件夾)virtualenv 虛擬環境名稱進入虛擬換cd 虛擬環境名稱source ./bin/activate退出虛擬環境deactivate刪除虛擬環境直接刪除「虛擬環境名稱」文件夾使用 virtualenvwrapper
  • 零基礎Python入門教程 - 第三節 搭建Python開發環境
    今天教大家搭建自己的Python開發環境,Python作為跨平臺語言,目前支持Windows、Linux、Mac/OS系統,考慮到後兩個系統使用門檻高,而大家對Windows的使用相對不是那麼陌生,所以我們就以Windows環境為例進行講解。
  • 詳解中文維基百科數據處理流程及腳本代碼
    https://github.com/bamtercelboo/corpus_process_script/tree/master/chinese_t2s使用:python chinese_t2s.py –input input_file –output output_filelike:python chinese_t2s.py
  • python+ pycharm 環境安裝 + pycharm使用
    >9.如果在cmd中輸入「python」指令後報錯,則說明環境變量配置有誤,這個時候需要手動配置環境變量10.首先找到python安裝路徑,把路徑拷貝下來,這裡我是把python安裝到E盤了,所以我的路徑在E盤11.在彈出的環境變量窗口中,點擊系統變量下的Path變量,點擊編輯,進入Path頁面
  • Stacking 模型融合詳解(附python代碼)
    Stacking 的基本思想  將個體學習器結合在一起的時候使用的方法叫做結合策略。對於分類問題,我們可以使用投票法來選擇輸出最多的類。對於回歸問題,我們可以將分類器輸出的結果求平均值。Stacking是模型融合的一個重要的方法,幾乎每個數據科學競賽的前幾名都會使用,接下來我主要是介紹stacking的原理。相信大家看很多stacking的資料都會看到下面的這個圖:
  • Python每天一分鐘:pass與assert語句詳解
    今天為大家介紹的是python中兩個經典的語句:pass語句和assert語句!請注意我們這裡用的修飾詞是語句,表明其使用方式類似if,else,for等這樣的修飾語句,而不是函數。python中的pass和assert語句pass語句詳解很多程式語言都提供了「空語句」支持,如C/C++/JAVA
  • python 定時器具體的使用代碼介紹
    python 定時器具體的使用代碼介紹 python 定時器在我們使用的時候有不少需要注意的事情,下面我們就看看如何才能更好的使用這個相關的語句。希望大家有所收穫。
  • Python學習|Anaconda、Jupyter Notebook、pycharm安裝使用詳解
    本文還對Jupyter Notebook的使用進行了講解,包括 Jupyter Notebook 如何與 Anaconda 聯合使用,進行不同 環境的 python 開發。本文會介紹pycharm,如何安裝、如何新建工程、如何與 Anaconda 聯合使用。
  • 利用Anaconda在Windows及Linux下搭建Python環境【手把手版】
    內置)python3基礎09列表推導式|迭代器|生成器|匿名函數python3基礎10面向「對象」編程python3基礎11異常處理|文件讀取|文件寫入python3基礎12詳解模塊和包(庫)|構建|使用python數據分析包|NumPy-01python數據分析包|NumPy-02python數據分析包|Pandas-01之DataFrame
  • 強化學習之原理詳解、算法流程及Python代碼
    智能體agent根據當前對環境的觀察採取動作獲得環境的反饋,並使環境發生改變的循環過程蒙特卡洛強化學習1.在現實的強化學習任務中,環境的轉移概率、獎勵函數往往很難得知,甚至很難得知環境中有多少狀態。若學習算法不在依賴於環境建模,則稱為免模型學習,蒙特卡洛強化學習就是其中一種。
  • conda虛擬環境詳細教程(Linux)
    最近在使用pytorch做深度學習相關的項目,本機環境不能改變(工作需要),所以就使用conda創建了該項目的虛擬環境,方便開發測試,本節主要記錄整個流程,方便以後回顧時快速完成。注意:設置完環境變量後要注意下python的版本會變為anaconda的python版本,比如我的機器就從python2.7變為了python3.7這樣會影響其它程序的正常運行,解決方法如下:先which下看看python使用的哪個,可以看到是剛安裝的anaconda中的python
  • 如何用iPad運行Python代碼?
    再加上虛擬環境配置,你就要抓狂了。還有的,甚至是網絡擁塞問題。因為有時需要現場安裝調用體積龐大的軟體包,幾十臺電腦「預備——齊」一起爭搶有限的Wifi帶寬,後果可想而知。痛定思痛,我決定改變一下現狀。目前的教程只提供基礎原始碼。對於許多新手同學來說,是不夠的。許多同學,就倒在了安裝依賴軟體包的路上,繼而乾脆放棄了。
  • Python 實戰多元線性回歸模型,附帶原理+代碼
    來源 | 早起Python( ID:zaoqi-python )「多元線性回歸模型」非常常見,是大多數人入門機器學習的第一個案例,儘管如此,裡面還是有許多值得學習和注意的地方。其中多元共線性這個問題將貫穿所有的機器學習模型,所以本文會「將原理知識穿插於代碼段中」,爭取以不一樣的視角來敘述和講解「如何更好的構建和優化多元線性回歸模型」。主要將分為兩個部分:
  • @Python 開發者,如何更加高效地編寫代碼?
    對於 Python 開發者而言,Anaconda 能省下大量時間下載和安裝模塊包、處理項目環境等問題,幫助開發者更加愉快地編寫代碼。如果你苦於給 Python 安裝各種包,安裝過程中還各種出錯。那麼我牆裂推薦——Anaconda,它可以幫助你管理這些包,包括安裝、卸載、更新。
  • Python 探針實現原理
    本文呢,將簡單講述一下 Python 探針的實現原理。同時為了驗證這個原理,我們也會一起來實現一個簡單的統計指定函數執行時間的探針程序。對於函數對象,我們可以使用裝飾器的方式來替換函數對象(代碼可以從 github 上下載 part2) :import functoolsimport timedef func_wrapper(func):    @functools.wraps(func)    def wrapper(*args, **kwargs):        print
  • 代碼詳解:如何用Python運行高性能的數學範式?
    首先需要明確的是:編寫python代碼和編寫pythonic代碼之間存在很大差異。這篇文章圍繞一些最常用的數據科學操作編寫了最佳(也存在爭議的)實踐。下面是在Github上運行的連結,用於整個代碼基礎:harshitcodes/python_paradigmsA guide to: How to compare different implementation paradigms
  • 【python】os 模塊使用筆記
    理論上講,我們通過上一節的讀寫文件可以完成文件複製,只不過要多寫很多代碼。幸運的是shutil模塊提供了copyfile()的函數,你還可以在shutil模塊中找到很多實用函數,它們可以看做是os模塊的補充。
  • Python盜號原理-代碼實現截屏鍵盤記錄遠程發送(不要做壞事)
    今天呢我們就以前面的幾篇技術文章做鋪墊,來講一下python盜號的原理(學習用途,請勿用於違法犯罪),知己知彼方能百戰不殆嘛脫褲我們就不多提了,無非就是過濾不嚴謹導致的sql注入,或者資料庫存儲不安全,這個本篇文章暫且不說,當然有感興趣的,我後面的文章或許也會講講。