《Python3.6官方文件》– 第12章 虛擬環境和包
原文連結 譯者:Carvendy
12. 虛擬環境和包
12.1 介紹
Python應用程式總會使用一些包和模組,它們離不開標準庫。應用程式需要指定標準庫的版本,因為應用程式可能需要避免一個已經修復的bug,或者是應用程式重寫了具體版本標準庫的介面的實現。
這意味著也許不可能需要給每一個應用程式安裝它所需要的的版本。如果應用A需要1.0的部分模組,而應用B需要版本2.0的,這樣是會產生衝突的,並且只安裝1.0或者2.0版本將會使得另外一個應用無法正常執行。
解決這個問題的方法就建立虛擬環境,它是一個自包含目錄樹,裡面安裝有Python各個版本,一個數字一個包版本地區分開來。
不同的應用程式可以使用不同的環境變數。為了解決前面的衝突,應用程式A可以有自己的虛擬環境並使用版本1.0,同時應用程式B可以使用虛擬環境的版本2.0。如果應用程式B需要升級到版本3.0,也一樣不會對應用程式的環境影響。
12.2 建立虛擬環境
建立和管理虛擬環境的模組被稱為venv。venv將會安裝你可以用的最新Python版本。如果你的系統有多個版本,你可以指定一個版本並通過python3來執行,或者是你想要的方式。
為了建立虛擬環境,決定使用一個你想要的目錄之前,要執行venv模組,即使用指令碼指定目錄:
python3 -m venv tutorial-env
如果不存在則建立tutorial-env目錄,建立目錄會包含一個拷貝的Python直譯器、標準庫、各種支援的檔案。
當你建立一個虛擬環境,你需要啟用它。
在Window上,執行:
tutorial-env\Scripts\activate.bat
在Unix或者是MacOS,執行:
source tutorial-env/bin/activate
啟用虛擬環境,將會改變你當前在shell中使用的虛擬環境,並且修改環境會讓你在執行python時,得到你所安裝的版本的Python。
$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May 6 2016, 10:59:36)
...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip' , ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>
12.3 使用pip管理包
你可以使用pip來實現安裝,升級,和移除一個包。pip會預設安裝了來自Python包索引,https://pypi.org/。你可以通過瀏覽器來瀏覽包索引,或者使用pip的搜尋特性:
(tutorial-env) $ pip search astronomy
skyfield - Elegant astronomy for Python
gary - Galactic astronomy and gravitational dynamics.
novas - The United States Naval Observatory NOVAS astronomy library
astroobs - Provides astronomy ephemeris to plan telescope observations
PyAstronomy - A collection of astronomy related tools for Python.
...
pip有很多子命令:”search”,”install”,”uninstall”,”freeze”,等。(可以通過pip來查閱Python的安裝模組的完整文件。)
你可以通過指定包名來安裝最新的版本的。
(tutorial-env) $ pip install novas
Collecting novas
Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
Running setup.py install for novas
Successfully installed novas-3.1.1.3
你也可以通過包名後加**==**和版本號來安裝指定版本的包:
(tutorial-env) $ pip install requests==2.6.0
Collecting requests==2.6.0
Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0
如果你再次執行這個命令,pip會檢查到這個版本已經安裝了不會做任何操作。你可以使用一個不同版本來安裝,或者使用命令pip install –upgrade來更新最新版本:
(tutorial-env) $ pip install --upgrade requests
Collecting requests
Installing collected packages: requests
Found existing installation: requests 2.6.0
Uninstalling requests-2.6.0:
Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0
pip uninstall可以跟著一個或者多個包名,並從虛擬環境中移除這些包:
pip show會顯示一個包的資訊:
(tutorial-env) $ pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: [email protected]
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:
pip list會顯示在虛擬環境中安裝的所有包:
(tutorial-env) $ pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
pip freeze會生成已經安裝的包列表,但是輸出格式是pip install所需要的。通常輸出列表會到requirements.txt檔案中:
(tutorial-env) $ pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0
requirements.txt檔案會被委託來控制和安裝到應用程式中。使用者可以通過install -r安裝所有重要的包。
(tutorial-env) $ pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
...
Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
...
Collecting requests==2.7.0 (from -r requirements.txt (line 3))
...
Installing collected packages: novas, numpy, requests
Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0
pip已經有很多功能了。可以通過pip來查閱Python的安裝模組的完整文件。當你在寫一個包並希望把它釋出到Python包索引,可以使用Python分佈模組指南。