1. 程式人生 > >使用python的虛擬環境virtualenv

使用python的虛擬環境virtualenv

# 技術背景 在前面幾篇部落格中我們介紹了容器的使用([部落格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