使用python的虛擬環境virtualenv
阿新 • • 發佈:2021-04-02
# 技術背景
在前面幾篇部落格中我們介紹了容器的使用([部落格1](https://www.cnblogs.com/dechinphy/p/pdflatex.html)、[部落格2](https://www.cnblogs.com/dechinphy/p/mindspore.html)、[部落格3](https://www.cnblogs.com/dechinphy/p/cplex.html)、[部落格4](https://www.cnblogs.com/dechinphy/p/ortools.html)、[部落格5](https://www.cnblogs.com/dechinphy/p/singularity-install.html)),容器是一種系統級的隔離方案,更多的強調資源上的隔離。而這裡我們要介紹的python的虛擬環境,更加強調的是依賴的管理。假如一個python專案需要依賴於`numpy==1.20.1`的版本,另一個python專案必須依賴於`numpy==1.20.2`的版本。雖然我們也可以直接使用docker或者其他的容器方案來隔離程式設計環境,但是這會消耗比較大的資源,因為我們並不需要重新構造一整個系統。因此python也提供了一種更加優雅的解決方案:使用`virtualenv`來構造一個虛擬的python庫的環境,這裡面我們可以定製化自己所需的python依賴的版本。比較詳細的virtualenv使用方法可以參考[官方文件](https://virtualenv.pypa.io/en/latest/installation.html#via-pip),這裡我們僅做一些簡單的使用方法的介紹和演示。
# 安裝virtualenv
virtualenv可以直接通過pip來安裝和管理,這也大大簡化了我們的操作:
```bash
[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的使用步驟基本上可以簡單劃分為:建立環境-啟用環境-配置和使用環境-關閉環境,以下分別進行演示。
## 建立一個虛擬環境
首先我們進入到一個空的目錄:
```bash
[dechin@dechin-manjaro virtualenv]$ ll
總用量 0
```
然後直接執行`virtualenv envname`的命令來構建一個虛擬環境,這裡因為我們系統中只有一個python版本,多個python版本的環境需要使用`-p`選項來進行配置。
```bash
[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
```
執行完成上述指令之後,我們發現在剛才的目錄下生成了一個與虛擬環境名稱一致的目錄名:
```bash
[dechin@dechin-manjaro virtualenv]$ ll
總用量 4
drwxr-xr-x 4 dechin dechin 4096 4月 1 21:06 test_env
```
這就代表虛擬環境已經建立成功了。
## 啟用虛擬環境
在使用一個指定的虛擬環境時,我們需要先啟用這個虛擬環境,在虛擬環境目錄下的bin目錄中,有一個名為activate的可執行檔案,就是用來啟用虛擬環境的:
```bash
[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來進行安裝包的管理,只是這時候安裝所執行的變更只會儲存到當前的虛擬環境下,不影響實際環境和其他的虛擬環境。
```bash
(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的版本號:
```bash
[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`退出。我們可以測試這樣的一個場景:先退出虛擬環境,然後再次進入,以確認剛才的操作被自動的儲存到了虛擬環境中:
```bash
(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/de