Python虛擬環境

veelion發表於2019-02-26

我們在寫Python程式的時候,經常會用到非標準庫的包和模組,比如requests等非常有用的第三方包和模組。有時候也會用到某個包和模組的特定版本,可能是這個特定的版本修復了某個bug,或者是依賴的介面只有該版本有。也可能系統安裝了Python 3.6,但應用程式要求 3.7 或 Python 2.7。

Python虛擬環境

這些情況註定了對多個Python及其庫的需求。如果我們寫的程式依賴某個庫的1.0的版本,而系統安裝的是1.2的版本,應用程式就無法執行;如果應用程式要求Python 2.7,則它在Python3上就可能會儲存。

要解決這些不同需求的問題就是使用虛擬環境,它是一個目錄樹,其中安裝特定的Python版本及需要的庫的版本。這樣,不同的應用可以使用不同的虛擬環境來滿足其執行條件。不同虛擬環境內部的庫版本涉及不會影響其它虛擬環境。

Python虛擬環境的建立和使用

在Python 2 時代,虛擬環境管理用的是virtualenv及其封裝virtuaalenvwrapper這兩個包(通過 pip install可以安裝)。它們也支援在Python3下使用。virtuaalenvwrapper是使用shell開發的,因此不支援Windows。支援Windows的叫做virtuaalenvwrapper-win

從 Python 3.3 開始,引入了新的庫venv來進行虛擬環境的管理,詳見 PEP-405 的描述。它的很多操作都和virtualenv類似。pyvenv是Python 3.3 和 3.4 中建立虛擬環境的推薦工具,但是在 Python 3.6 中已經棄用,之後的版本還是用 venv

使用venv建立虛擬環境還是很容易的,將venv模組作為指令碼執行並確定虛擬環境存放的路徑即可:

python3 -m venv /path/to/myenv

這條命令將建立/path/to/myenv目錄,並在其中建立包含Python直譯器、標準庫和各種支援檔案的目錄:

myenv
├── bin
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── easy_install
│   ├── easy_install-3.6
│   ├── pip
│   ├── pip3
│   ├── pip3.6
│   ├── python -> python3.6
│   ├── python3 -> python3.6
│   └── python3.6 -> /usr/bin/python3.6
├── include
├── lib
│   └── python3.6
│       └── site-packages
├── lib64 -> lib
└── pyvenv.cfg

建立虛擬環境後,就可以啟用並使用它。在Linux和macOS上,執行:

source /path/to/myenv/bin/activate

(這個指令碼是為bash shell編寫的,如果你使用的是cshfish shell,就要使用activate.cshactivate.fis指令碼來啟用。)

啟用虛擬環境後,你的shell提示就會顯示你正在使用的虛擬環境的名稱,你就可以使用該虛擬環境下的Python及相關的庫了:

$ source myenv/bin/activate
(myenv) veelion@gtx:~/p2/tutorial/md_Python/codes$ which python
/home/veelion/p2/tutorial/md_Python/codes/myenv/bin/python
(myenv) veelion@gtx:~/p2/tutorial/md_Python/codes$ python
Python 3.6.8 (default, Dec 24 2018, 19:24:27) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/veelion/p2/tutorial/md_Python/codes/myenv/lib/python3.6/site-packages']
>>> 

執行venv的命令如果加-h選項,就可以看到詳細的使用方法:

$ python3 -m venv -h
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
            [--upgrade] [--without-pip]
            ENV_DIR [ENV_DIR ...]

Creates virtual Python environments in one or more target directories.

positional arguments:
  ENV_DIR               A directory to create the environment in.

optional arguments:
  -h, --help            show this help message and exit
  --system-site-packages
                        Give the virtual environment access to the system
                        site-packages dir.
  --symlinks            Try to use symlinks rather than copies, when symlinks
                        are not the default for the platform.
  --copies              Try to use copies rather than symlinks, even when
                        symlinks are the default for the platform.
  --clear               Delete the contents of the environment directory if it
                        already exists, before environment creation.
  --upgrade             Upgrade the environment directory to use this version
                        of Python, assuming Python has been upgraded in-place.
  --without-pip         Skips installing or upgrading pip in the virtual
                        environment (pip is bootstrapped by default)

Once an environment has been created, you may wish to activate it, e.g. by
sourcing an activate script in its bin directory.

Ubuntu 16.04 上 Python2 使用 virtualenvwrapper 建立 Python 3 的虛擬環境

Ubuntu 16.04 系統預設的Python 還是2,要在這個系統上使用Python 3.6 或 Python 3.7,最好的方法就是建立它們的虛擬環境。目前可能還有很多人在使用這個版本的Ubuntu,所以有必要講一下這一小節的內容。這裡,我們推崇使用virtualenvwrapper,拒絕使用Anacodna

(1)Ubuntu 16.04 上安裝 Python 3.6,3.7 和 3.8

可以通過ppa源安裝,也可以從原始碼編譯安裝。為了方便(安裝和以後更新),我們選擇ppa:

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.6 python3.6-dev

如果安裝3.7或3.8,替換掉上面命令中的3.6即可。

連線PPA比較慢的話,可以用USTC的反向代理,https://lug.ustc.edu.cn/wiki/mirrors/help/revproxy
只要一句話,全替換成USTC加速的PPA:

sudo find /etc/apt/sources.list.d/ -type f -name "*.list" -exec sed  
-i.bak -r  's#deb(-src)?\s*http(s)?://ppa.launchpad.net#deb\1 
http\2://launchpad.proxy.ustclug.org#ig' {} \;

(2)安裝配置virtualenvwrapper

首先,安裝virtualenvwrapper

sudo pip install virtualenvwrapper

這會將virtualenvwrapper安裝到Ubuntu系統的 Python2 搜尋的路徑,同時也會安裝它依賴的virtualenv庫。

接著,編輯~/.bashrc,寫入一下配置:

# virtualenvwrapper settings
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_SCRIPT=/usr/local/bin/virtualenvwrapper.sh
source /usr/local/bin/virtualenvwrapper_lazy.sh

配置了虛擬環境的根目錄是$HOME/.virtualenvs。為了使以上配置生效,執行命令:

$ source ~/.bashrc

這時候,命令列裡面就有了命令:mkvirutalenv

(3)建立虛擬環境

執行命令:

mkvirtualenv py3.6 -p=/usr/bin/python3.6

它的意思是,建立一個名為py3.6的虛擬環境,它的直譯器是/usr/bin/python3.6,即我們建立了一個Python 3.6的虛擬環境叫做py3.6。

workon命令來啟用py3.6這個虛擬環境:

$ workon py3.6
(py3.6) veelion@gtx:~$

這是shell提示的開始多了(py3.6)

退出虛擬環境,返回系統預設環境的命令是:

deactivate

Python虛擬環境總結

(1)虛擬環境是幹什麼用的?
(2)Python3 官方自帶的 venv 的使用
(3)在Python2下用virtualenvwrapper建立Python3.6的虛擬環境。

練習:

建立自己的虛擬環境,如果你用的是Python3,請用官方的venv來建立虛擬環境。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章