-
1 # 鎧撒情報站
-
2 # 八手程式猿
Python應用程式通常會使用不在標準庫內的軟體包和模組。應用程式有時需要特定版本的庫,因為應用程式可能需要修復特定的錯誤,或者可以使用庫的過時版本的介面編寫應用程式。
這意味著一個Python安裝可能無法滿足每個應用程式的要求。如果應用程式A需要特定模組的1.0版本但應用程式B需要2.0版本,則需求存在衝突,安裝版本1.0或2.0將導致某一個應用程式無法執行。
這個問題的解決方案是建立一個 virtual environment,一個目錄樹,其中安裝有特定Python版本,以及許多其他包。
然後,不同的應用將可以使用不同的虛擬環境。 要解決先前需求相沖突的例子,應用程式 A 可以擁有自己的 安裝了 1.0 版本的虛擬環境,而應用程式 B 則擁有安裝了 2.0 版本的另一個虛擬環境。 如果應用程式 B 要求將某個庫升級到 3.0 版本,也不會影響應用程式 A 的環境。
1. 建立虛擬環境
用於建立和管理虛擬環境的模組稱為 venv。venv 通常會安裝你可用的最新版本的 Python。如果您的系統上有多個版本的 Python,您可以透過執行 python3 或您想要的任何版本來選擇特定的Python版本。
要建立虛擬環境,請確定要放置它的目錄,並將 venv 模組作為指令碼執行目錄路徑:
python3 -m venv tutorial-env
如果它不存在,這將建立 tutorial-env 目錄,並在其中建立包含Python直譯器,標準庫和各種支援檔案的副本的目錄。
虛擬環境的常用目錄位置是 .venv。 這個名稱通常會令該目錄在你的終端中保持隱藏,從而避免需要對所在目錄進行額外解釋的一般名稱。 它還能防止與某些工具所支援的 .env 環境變數定義檔案發生衝突。
建立虛擬環境後,您可以啟用它。
在Windows上,執行:
tutorial-env\Scripts\activate.bat
在Unix或MacOS上,執行:
source tutorial-env/bin/activate
(這個指令碼是為bash shell編寫的。如果你使用 csh 或 fish shell,你應該改用 activate.csh 或 activate.fish 指令碼。)
Activating the virtual environment will change your shell"s prompt to show what virtual environment you"re using, and modify the environment so that running python will get you that particular version and installation of Python. For example:
$ 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"] >>>
2. 使用pip管理包
你可以使用一個名為 pip 的程式來安裝、升級和移除軟體包。預設情況下 pip 將從 Python Package Index <https://pypi.org> 安裝軟體包。你可以在瀏覽器中訪問 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”等等。(請參閱 安裝 Python 模組 指南以瞭解 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 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 模組 指南。
-
3 # 不止於程式設計
可以的,而且docker功能遠不止於此,docker技術解決了開發環境和開發環境不一致的問題,舉個例子,如果你在windows用python自帶的venv建立虛擬環境來給django用,然後你部署django專案到ubuntu或者centos,你是不能直接把這個虛擬環境拿來用的。而docker可以讓你在windows上編寫好dockerfile檔案直接在ubuntu或者centos上用,只要開發環境沒問題,生產環境就99%沒問題,至於那1%留給程式玄學吧
回覆列表
由於開發一個python程式時需要依賴大量的三方庫包,且python2和3本身就有互不相容的地方,我們往往需要一個隔離的環境,來避免版本影響造成的bug。而隨著容器技術的日漸成熟和普及,Docker無疑成為解決這個問題的最優解