我們在寫Python程式的時候,經常會用到非標準庫的包和模組,比如requests等非常有用的第三方包和模組。有時候也會用到某個包和模組的特定版本,可能是這個特定的版本修復了某個bug,或者是依賴的介面只有該版本有。也可能系統安裝了Python 3.6,但應用程式要求 3.7 或 Python 2.7。
這些情況註定了對多個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
編寫的,如果你使用的是csh
或fish
shell,就要使用activate.csh
或activate.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
來建立虛擬環境。
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***