1. 程式人生 > 程式設計 >python虛擬環境模組venv使用及示例

python虛擬環境模組venv使用及示例

相信只要學習python的同學對於虛擬環境這個概念肯定不會太陌生,虛擬環境指的是一個個單獨隔離的python開發環境。各個虛擬環境之間互不干擾,都有自己獨立的開發包。就像是在電腦上裝了很多個虛擬機器,每個虛擬機器裡面你隨便折騰,不會影響到物理機,也不會影響到其他虛擬機器。

既然這麼有用,那麼Python裡面用來建立虛擬環境的模組virtualenv是怎麼使用的呢?我們一起來看一下。

virtualenv基本命令格式

這個模組比較簡單,它只有一條命令,但是跟的選項比較多,就是通過不同的選項來控制生成不同的虛擬環境。我們先來簡單看一下它的基本命令格式:

virtualenv [--version] [--with-traceback] [-v | -q] [--app-data APP_DATA] [--clear-app-data] [--discovery {builtin}] [-p py] 
[--creator {builtin,cpython3-win,venv}] [--seeder {app-data,pip}] [--no-seed] [--activators comma_sep_list][--clear] 
[--system-site-packages] [--copies] [--download | --no-download] [--extra-search-dir d [d ...]] [--pip version] 
[--setuptools version] [--wheel version] [--no-pip] [--no-setuptools] [--no-wheel]
[--symlink-app-data] [--prompt prompt] [-h]
dest

乍一看,選項怎麼這麼多,一下子就能把人看暈,這還怎麼學。但是在最開始使用的時候,常用的引數就只有下面兩個:

  • -p py 用於選擇python直譯器版本的
  • dest 要存放虛擬環境的目錄,一般是專案目錄
  • --prompt prompt 設定虛擬環境命令提示符前端提示。

引數比較抽象,我們還是通過具體的例子來實踐,

示例

先開啟cmd命令列視窗,執行python命令,確認你的python包安裝正確。如下所示:

C:\Users\Administrator>python
Python 3.7.3 (v3.7.3:ef4ec6ed12,Mar 25 2019,22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help","copyright","credits" or "license" for more information.
>>>

然後我們來安裝好virualenv模組,命令是:

C:\Users\Administrator>pip install virtualenv
Looking in indexes: http://pypi.doubanio.com/simple
Collecting virtualenv
 Downloading http://pypi.doubanio.com/packages/c1/61/7506ddd79ef6f09beeefb81c4c55bf395a8ad96b33ff1c6b06e40f8aa101/virtualenv-20.0.7-py2.py3-none-any.whl (8.0 MB)
   |████████████████████████████████| 8.0 MB 6.8 MB/s
......
Installing collected packages: virtualenv
Successfully installed virtualenv-20.0.7

中間省略了一部分輸出容,但是可以看到virtualenv模組安裝成功。然後我們就來建立一個新的虛擬環境:

C:\Users\Administrator>virtualenv myproject
created virtual environment CPython3.7.3.final.0-64 in 6317ms
 creator CPython3Windows(dest=C:\Users\Administrator\myproject,clear=False,global=False)
 seeder FromAppData(download=False,pip=latest,setuptools=latest,wheel=latest,via=copy,app_data_dir=C:\Users\Administrator\AppData\Local\Temp\tmpsvdy5dr2\seed-app-data\v1)
 activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

這裡的虛擬環境目錄名詞是myproject,就這麼簡單的命令建立了一個虛擬環境。它位於myproject目錄下。建立過程中如果沒有報錯就說明建立成功,同時它還指出了虛擬環境的Python版本,可以看到,就是我們系統當前安裝的虛擬版本。
我們檢視一下這個目錄:

 C:\Users\Administrator\dir myproject

2020/03/02 17:04  <DIR>     .
2020/03/02 17:04  <DIR>     ..
2020/03/02 17:04  <DIR>     Lib
2020/03/02 17:04        316 pyvenv.cfg
2020/03/02 17:04  <DIR>     Scripts

可以看到裡面有兩個目錄和一個檔案,

  • Lib目錄是必須的庫檔案目錄,
  • Scripts是虛擬環境的二進位制命令檔案目錄以及啟動器所在目錄。啟動器就是待會我們要用來啟用虛擬環境的目錄。
  • pyvenv.cfg檔案是這個虛擬環境的配置檔案

我們來嘗試啟用這個虛擬環境,命令如下:

# 切換到虛擬環境目錄
C:\Users\Administrator>cd myproject

# 啟用虛擬環境
C:\Users\Administrator\myproject>Scripts\activate

此時沒有任何輸出,而且命令提示符的視窗也沒有任何改變,怎麼判斷虛擬環境已經啟用成功了呢?我們使用pip命令來判斷一下,:

C:\Users\Administrator\myproject>pip list
Package  Version
---------- -------
pip    20.0.2
setuptools 45.2.0
wheel   0.34.2

可以看到,這個時候的pip安裝的包只有三個,分別是pip、setuptools、wheel。而我們實際的系統環境因為我一直在使用,我重新開啟一個命令提示符視窗,直接執行pip list命令結果如下:

C:\Users\Administrator>pip list
Package      Version
------------------ ---------
-ip        19.0.3
appdirs      1.4.3
attrs       19.3.0
backcall      0.1.0
bleach       3.1.0
colorama      0.4.3
decorator     4.4.1
defusedxml     0.6.0
distlib      0.3.0
Django       2.2
....

說明我們的虛擬環境確實啟用成功了,只是看起來不明顯。但是這個時候虛擬環境確實已經可以使用了。那麼使用完畢後該怎麼退出呢?啟動是activate,那麼退出就是deactivate。如下所示:

C:\Users\Administrator\myproject>Scripts\deactivate.bat
C:\Users\Administrator\myproject>pip list
Package      Version
------------------ ---------
-ip        19.0.3
appdirs      1.4.3
attrs       19.3.0
backcall      0.1.0
bleach       3.1.0
colorama      0.4.3
decorator     4.4.1
defusedxml     0.6.0
distlib      0.3.0
Django       2.2
entrypoints    0.3

執行完deactivate命令後,再執行pip list命令,可以看到輸出的是系統python的路徑,這個時候說明已經從虛擬環境退出了。

但是這個過程確實不太明顯,那麼能不能把 虛擬環境弄的更明顯一點呢,我們來看看--prompt這個選項的用法:

C:\Users\Administrator>virtualenv --prompt myproject2 myproject2

建立一個新的虛擬環境叫做myproject2,但是使用了--prompt myproject2的選項引數,我們再來嘗試啟用一下看看:

C:\Users\Administrator>cd myproject2
C:\Users\Administrator\myproject2>Scripts\activate
myproject2C:\Users\Administrator\myproject2>Scripts\deactivate.bat
C:\Users\Administrator\myproject2>

這個時候很明顯就可以看到,在命令提示符前端出現了一個myproject2的提示,而當我們執行deactivate指令碼後,提示符消失,說明回到了正常的環境。

這樣就比較明顯了。

上面的兩個例子演示的是直接使用系統版本python安裝的虛擬環境,既然是虛擬環境,那麼python的版本能不能切換呢?我們來嘗試一下-p選項的用法。

C:\Users\Administrator>virtualenv --prompt (myproject3) -p python3.8 myproject3
PEP-514 violation in Windows Registry at HKEY_LOCAL_MACHINE/PythonCore/2.7/InstallPath error: missing
RuntimeError: failed to find interpreter for Builtin discover of python_spec='python3.8'

在上面的示例中,我嘗試建立以python3.8來建立myproject3這個專案,但是失敗了。它在系統裡沒有找到python3.8的版本。
我們知道,在windows中,不同的python是可以安裝在不同的目錄中,但是你係統使用哪個版本,就把哪個版本的路徑新增到系統的環境變數最前面即可。剛才的例子裡看到我目前使用的主版本是3.7.3,這個時候如果想要使用python3.8來建立虛擬環境的話,就需要告知3.8版本的實際路徑:

C:\Users\Administrator>virtualenv --prompt (myproject3) -p "D:\Program Files (x86)\Python38\python.exe" myproject3
created virtual environment CPython3.8.2.final.0-64 in 6798ms
 creator CPython3Windows(dest=C:\Users\Administrator\myproject3,app_data_dir=C:\Users\Administrator\AppData\Local\Temp\tmpxuz4d8ys\seed-app-data\v1)
 activators BashActivator,XonshActivator

這個時候就可以建立成功了,這裡有兩點需要注意:

  1. 必須給出python.exe檔案的絕對路徑
  2. 路徑中如果有空格,則必須使用雙引號括起。

建立成功以後,我們嘗試啟用

C:\Users\Administrator>cd myproject3

C:\Users\Administrator\myproject3>Scripts\activate

(myproject3)C:\Users\Administrator\myproject3>python
Python 3.8.2 (tags/v3.8.2:7b3ab59,Feb 25 2020,23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help","credits" or "license" for more information.
>>>

可以看到,確實是3.8.2版本的Python,此時新版本的虛擬環境建立成功。

基本用法就是這麼兩個,linux系統下的操作和這裡的類似,大家可以自己去嘗試一下,如果有遇到什麼問題可以留言和阿飛一起討論。

實際使用的其他引數可以看一下下面的引數解析,寫的比較詳細,大家可以根據自己的需要來檢視。

引數解析

如果將virtualenv的所有引數進行分類,主要分為下面幾類:

1. 只用於輸出資訊的,包括下面幾個:

  • --version 輸出virtualenv版本資訊
  • -h,--help 輸出virtualenv幫助資訊
  • --with-traceback,在建立虛擬環境失敗的時候,輸出追蹤資訊。
  • -v,--verbose,設定輸出資訊等級,一般用於增加資訊輸出等級,預設值是2
  • -q,--quit,設定輸出資訊等級,一般用於降低資訊輸出等級,預設值是0

最後兩個選項這裡要解釋一下,資訊輸出等級指的是virtualenv在執行命令過程中輸出的資訊等級,分為5個類,對應的值分別是:

  • CRITICAL 0 災難級資訊
  • ERROR 1 錯誤級資訊
  • WARNING 2 警告級資訊
  • INFO 3 普通訊息
  • DEBUG 4除錯資訊
  • NOTEST 5 非測試資訊

也就是說-q/--quit是將資訊級別設定為CRITICAL,即只有災難級資訊才會輸出,-v/--verbose 後面跟上對應的值,即可調整對應的資訊級別。例如-v 4,即將資訊級別調整為DEBUG級別。

2. 通用設定

即在使用virualenv命令的時候全域性通用的配置,主要有:

  • --app-data APP_DATA 用於配置virutalenv使用的快取目錄,預設是<temp 目錄>,對於windows系統通常是%USERPROFILE%\AppData\Local\Temp這個目錄,對於linux系統是/tmp目錄。
  • --clear-app-data virtualenv啟動的時候使用空的app資料目錄,預設值False,即預設使用快取目錄,便於加快虛擬環境建立。

3. 發現

發現這個配置是用來查詢目標Python直譯器的,當你建立虛擬環境的時候,你的虛擬環境以哪個Python直譯器版本作為模板來建立呢?這個時候就需要用到發現這個元件來查找了。對應的選項有:

  • --discovery {builtin} 直譯器發現方法,預設值builtin,即內建的發現元件。現在好像只有這一個可以選擇。也就是說,這個選專案前對於普通使用者來說沒什麼用。除非你能夠自己實現一個發現元件。
  • -p py,--python py,用於建立虛擬環境的目標python直譯器,即以這個引數指定的python直譯器版本來建立虛擬環境。預設值是你當前安裝virutalenv的python直譯器。它有兩種格式,分別是:
    • I. python直譯器的絕對路徑。
    • II. python版本的字串表示,字串的格式是{實現名稱}{版本}{架構},例如python3.8.1,cpython3等。

4. 創造器(creator)

創造器在virtualenv裡的作用是,實際執行虛擬環境建立過程的工具。它對應的選項有:

  • --creator {builtin,cpyhon3-win,venv},即通過哪個python直譯器來建立虛擬環境,預設是builtin,即安裝virtualenv的python版本。
  • dest,即安裝虛擬環境的目標目錄,可以使用相對路徑和絕對路徑
  • --clear,當目標目錄存在的時候,會移除目標目錄,或者覆蓋目標檔案,預設值False
  • --system-site-packages, 允許虛擬環境訪問系統site-packages目錄,預設值False
  • --copies, --always-copy,使用複製而不是連結來建立虛擬環境,即使平臺的預設配置是使用連結的方式。預設值True。建立虛擬環境有兩種方式,第一種是複製模板Python裡的檔案到虛擬環境中,第二種方式是從模板Python那裡建立軟連結到虛擬環境中,第二種速度更快,但是虛擬環境受到模板Python的影響也更大。因此一般推薦使用copy的方式。

5. 種子器(seeder)

種子器指的是什麼呢?我們知道python的包管理軟體是pip,但是還有另外兩個管理軟體,分別是setuptools和wheel。而種子器就是決定虛擬環境中,安裝這三個軟體中的哪幾個。有了包管理軟體,才能安裝更多的包。就像種子發芽成熟後能結出更多的種子。所以叫seeder這樣一個名字。對應的選項有:

  • --seeder {app-data,pip},種子包安裝方法,預設值app-data,即從快取目錄裡安裝。
  • --no-seed, --without-pip,即不安裝種子包(預設值False)
  • --download 從PyPI上下載安裝最新版本的pip/setuptools/wheel,預設值False
  • --no-download, --never-download,不下載最新版的pip/setuptools/wheel,預設值True
  • --extrea-search-dir,種除了預設的Python安裝的包以外,種子器可能會使用的包含其他包的路徑,預設值是[]
  • --pip version,--wheel version, --setuptools version,要安裝的pip,wheel,setuptools版本,預設值都是latest
  • --no-pip,--no-wheel,--no-setuptools,不安裝pip,wheel,setuptools,預設值都是False
  • --symlink-app-data,從app-data目錄連結python包到虛擬環境(目前還不支援,要求種子pip>=19.3,預設值False)

6. 啟動器(activator)

虛擬環境配置好以後,我們怎麼進入到虛擬環境,以及怎麼讓虛擬環境裡的配置生效呢?這個時候就需要用到啟動器了,啟動器的作用是,在shell或者系統的環境變數裡面,把虛擬環境的可執行命令路徑新增到最前面。保證在虛擬環境中,最先找到的命令是虛擬環境裡的命令。同樣的,當虛擬環境用完以後,我們需要回到正常的環境,這個時候還需要提供虛擬環境的關閉功能。這兩個功能都是在啟動器裡實現的。它對應的配置選項有:

  • --activator comma_sep_list, 要生成的啟動器列表,用逗號分隔。因為你在不同的系統中使用的是不同的shell,例如linux中有bash、tcsh、dash、zsh等,windows中有powershell,cmd等。因此針對不同的環境需要使用不同的啟動器。這個引數就是讓你說明你要生成哪些環境的啟動器。
  • --prompt prompt,在進入到虛擬環境的時候,一般都會在命令提示符的最前面標識出虛擬環境的名稱,便於區分實際環境和虛擬環境。而這個名稱就是通過這個引數來配置的。

到此這篇關於python虛擬環境模組venv使用及示例的文章就介紹到這了,更多相關python虛擬環境模組venv內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!