技術背景
在前面幾篇博客中我們介紹了容器的使用(博客1、博客2、博客3、博客4、博客5),容器是一種系統級的隔離方案,更多的強調資源上的隔離。而這里我們要介紹的python的虛擬環境,更加強調的是依賴的管理。假如一個python項目需要依賴於numpy==1.20.1
的版本,另一個python項目必須依賴於numpy==1.20.2
的版本。雖然我們也可以直接使用docker或者其他的容器方案來隔離編程環境,但是這會消耗比較大的資源,因為我們並不需要重新構造一整個系統。因此python也提供了一種更加優雅的解決方案:使用virtualenv
來構造一個虛擬的python庫的環境,這里面我們可以定制化自己所需的python依賴的版本。比較詳細的virtualenv使用方法可以參考官方文檔,這里我們僅做一些簡單的使用方法的介紹和演示。
安裝virtualenv
virtualenv可以直接通過pip來安裝和管理,這也大大簡化了我們的操作:
[dechin@dechin-manjaro virtualenv]$ python3 -m pip install virtualenv
Collecting virtualenv
Downloading virtualenv-20.4.3-py2.py3-none-any.whl (7.2 MB)
|████████████████████████████████| 7.2 MB 7.5 MB/s
Requirement already satisfied: appdirs<2,>=1.4.3 in /home/dechin/anaconda3/lib/python3.8/site-packages (from virtualenv) (1.4.4)
Collecting distlib<1,>=0.3.1
Downloading distlib-0.3.1-py2.py3-none-any.whl (335 kB)
|████████████████████████████████| 335 kB 8.5 MB/s
Requirement already satisfied: filelock<4,>=3.0.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from virtualenv) (3.0.12)
Requirement already satisfied: six<2,>=1.9.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from virtualenv) (1.15.0)
Installing collected packages: distlib, virtualenv
Successfully installed distlib-0.3.1 virtualenv-20.4.3
需要注意的是,這里雖然我們可以通過virtualenv來構造一個純凈的python編程環境,但是python的版本是直接依賴於系統里面所包含的python版本的,我們不能通過virtualenv去構造一個不同的python版本。
virtualenv的使用
virtualenv的使用步驟基本上可以簡單划分為:創建環境-激活環境-配置和使用環境-關閉環境,以下分別進行演示。
創建一個虛擬環境
首先我們進入到一個空的目錄:
[dechin@dechin-manjaro virtualenv]$ ll
總用量 0
然后直接執行virtualenv envname
的命令來構建一個虛擬環境,這里因為我們系統中只有一個python版本,多個python版本的環境需要使用-p
選項來進行配置。
[dechin@dechin-manjaro virtualenv]$ virtualenv test_env
created virtual environment CPython3.8.5.final.0-64 in 295ms
creator CPython3Posix(dest=/home/dechin/projects/2021-python/virtualenv/test_env, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/dechin/.local/share/virtualenv)
added seed packages: pip==21.0.1, setuptools==54.1.2, wheel==0.36.2
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
執行完成上述指令之后,我們發現在剛才的目錄下生成了一個與虛擬環境名稱一致的目錄名:
[dechin@dechin-manjaro virtualenv]$ ll
總用量 4
drwxr-xr-x 4 dechin dechin 4096 4月 1 21:06 test_env
這就代表虛擬環境已經創建成功了。
激活虛擬環境
在使用一個指定的虛擬環境時,我們需要先激活這個虛擬環境,在虛擬環境目錄下的bin目錄中,有一個名為activate的可執行文件,就是用來激活虛擬環境的:
[dechin@dechin-manjaro virtualenv]$ source test_env/bin/activate
(test_env)[dechin@dechin-20n2s01200 virtualenv]$ python3 -m pip list
Package Version
---------- -------
pip 21.0.1
setuptools 54.1.2
wheel 0.36.2
我們可以發現一個特點,在激活虛擬環境后,在Linux的命令行之前都會帶有一個虛擬環境的名稱,用於區分當前所在的虛擬環境。而這里虛擬環境中的python第三方庫是幾乎沒有的,是一個非常純凈的環境,需要我們自己去手動安裝與配置環境。
安裝與配置python庫
在虛擬環境中的操作跟在實際環境中的安裝操作是一致的,我們一樣也可以使用pip來進行安裝包的管理,只是這時候安裝所執行的變更只會保存到當前的虛擬環境下,不影響實際環境和其他的虛擬環境。
(test_env)[dechin@dechin-manjaro virtualenv]$ python3 -m pip install numpy
Collecting numpy
Downloading numpy-1.20.2-cp38-cp38-manylinux2010_x86_64.whl (15.4 MB)
|████████████████████████████████| 15.4 MB 295 kB/s
Installing collected packages: numpy
Successfully installed numpy-1.20.2
(test_env)[dechin@dechin-manjaro virtualenv]$ python3 -m pip list
Package Version
---------- -------
numpy 1.20.2
pip 21.0.1
setuptools 54.1.2
wheel 0.36.2
安裝完成后,我們看到當前安裝的numpy版本號是1.20.2。讓我們再打開一個新的終端窗口看下實際環境中的numpy的版本號:
[dechin@dechin-manjaro virtualenv]$ python3 -m pip show numpy
Name: numpy
Version: 1.20.1
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: /home/dechin/anaconda3/lib/python3.8/site-packages
Requires:
Required-by: xarray, vaex-core, tifffile, tables, statsmodels, seaborn, scipy, scikit-learn, scikit-image, PyWavelets, pytools, pythreejs, pyscf, pyarrow, projectq, plotdigitizer, patsy, pandas, opencv-python, numexpr, numba, mkl-random, mkl-fft, matplotlib, ipyvolume, ipydatawidgets, imageio, hiq-projectq, h5py, cupy, bqplot, Bottleneck, bokeh, bkcharts, astropy, ts, hiqfermion
這里可以區分的是,實際環境中命令行的前面不帶有虛擬環境的名稱。我們可以看到實際環境下的numpy版本是1.20.1,這樣一來我們就用這么一個開銷並不是很高的方式,實現了兩個不同的numpy版本的共存。
退出虛擬環境
在當前的虛擬環境下,可以直接執行deactivate
退出。我們可以測試這樣的一個場景:先退出虛擬環境,然后再次進入,以確認剛才的操作被自動的保存到了虛擬環境中:
(test_env)[dechin@dechin-manjaro virtualenv]$ deactivate
[dechin@dechin-manjaro virtualenv]$ source test_env/bin/activate
(test_env)[dechin@dechin-manjaro virtualenv]$ python3 -m pip list
Package Version
---------- -------
numpy 1.20.2
pip 21.0.1
setuptools 54.1.2
wheel 0.36.2
(test_env)[dechin@dechin-manjaro virtualenv]$ deactivate
在上述的執行結果中可以看到,對python環境的變更是永久保存下來了的。這一點上來說操作也比docker容器更加容易,在docker中如果需要持久化的保存一個操作,需要在對容器鏡像操作之后,執行額外的commit指令才能保存。因此我們認為virtualenv是一個更加優雅、更加輕量級的,python環境差異化管理的解決方案。
總結概要
在前面幾篇博客中我們介紹過docker等容器的編程環境解決方案,但是容器作為一個系統級的隔離方案,其實更加強調的是用戶間的隔離,這一點也得益其對NameSpace技術的推廣和使用。但是在一部分的場景下,比如快速構造一個純凈的python環境、輕量級的操作實現不同python包的共存,容器技術雖然也可以完成,但是功能顯得過於冗余,這就需要使用到本文所介紹的virtualenv這樣的一個python依賴管理解決方案。文中我們介紹了virtualenv的安裝與基本的使用方法,做了一遍比較完整的演示。
版權聲明
本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/virtualenv.html
作者ID:DechinPhy
更多原著文章請參考:https://www.cnblogs.com/dechinphy/