[譯]The Python Tutorial#Virtual Environments and Packages
12.1 Introduction
Python應用經常使用不屬于標準庫的包和模塊。應用有時會需要一個特定版本的庫,因為應用可能會需要一個特定bug得到修復的庫,或者應用依賴庫中一個廢棄版本的接口。
這意味著一個Python安裝可能無法滿足每個應用的需求。如果應用A依賴特定模塊的1.0版本,而應用B依賴其2.0版本,那么需求就沖突了,并且安裝1.0和2.0的任意一個版本都會導致其中一個應用無法運行。
以上問題的解決方案是創建虛擬環境,虛擬環境是包含一個特定Python版本的Python安裝以及一些附加包的獨立目錄樹。
不同的應用可以使用不同的虛擬環境。為解決先前需求沖突的例子,應用A可以擁有安裝了版本1.0的虛擬環境,而應用B可以擁有安裝了版本2.0的另一個虛擬環境。如果應用B需要升級到版本3.0的庫,這不會影響A的虛擬環境。
12.2 Creating Virtual Environments
用來創建和管理虛擬換環境模塊叫做venv
。venv
通常會安裝最近版本的Python。如果系統中有多個版本的Python,可以運行python3
或者其他任何版本來選擇一個指定的Python版本。
要創建一個虛擬環境,首先需要決定放置虛擬環境的目錄,然后以腳本方式運行帶有目錄路徑的venv
模塊:
python3 -m venv tutorial-env
如果tutorial-env
目錄不存在,會創建一個tutorial-env
目錄,同時在目錄中創建子目錄,包含Python解釋器,標準庫以及各種各樣支持文件的副本。
一旦創建了一個虛擬環境,就可以激活它了。
在Windows中,運行:
tutorial-env\Scripts\activate.bat
在Unix或者MacOS中,運行:
source tutorial-env/bin/activate
(這個腳本使用bash shell編寫。如果你使用csh或者fish shell,有activae.csh
以及activate.fish
腳本可供選擇)
激活虛擬環境會改變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 Managing Packages with pip
使用一個叫做pip的程序,可以安裝,更新和移除包。默認情況下pip
會從Python Package Index https://pypi.python.org/pypi 安裝包。可以使用瀏覽器瀏覽Python Package Index,或者使用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"等等(參考 Installing Python Modules獲取pip
的完整文檔)
指定包的名字,可以安裝最新版本的包:
(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: me@kennethreitz.com
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
還有其他許多選項。查閱 Installing Python Modules 獲取完整的pip
文檔。如果開發了一個包,并且希望在 Python Package Index上可用,查閱 Distributing Python Modules。