使用python的虛擬環境virtualenv


技術背景

在前面幾篇博客中我們介紹了容器的使用(博客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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM