Reproduce from pip 與 Pipfile,virtualenv
pip 是什么?
pip
是一個 Python 包也是 Python 推薦的包管理程序,可以用于安裝和管理 Python 包,Python 2.7.9+ 版本中已經(jīng)自帶了 pip 包。針對 Python 2 和 3,pip 分別提供了 pip
和 pip3
兩個命令。
pip 常用命令
- 基本用法:
pip install SomePackage
,等效于python -m pip install SomePackage
; - 明確指定版本號:
pip install SomePackage==1.0.0
; - 制定最小版本號:
pip install SomePackage>=1.0.0
; - 指定版本號區(qū)間:
pip install SomePackage>=1.0.0,<2.0.0
。
pip 也支持直接從文件讀取包列表一邊批量安裝,通常命名為 requirements.txt
,可以使用 pip install -r requirements.txt
來安裝。requirements.txt
文件內(nèi)容是如下的扁平格式:
SomePackage1
SomePackage2>=1.0.0
SomePackage3>=1.0.0,<2.0.0
Pipfile 與 Pipfile.lock
Pipfile
與 Pipfile.lock
是社區(qū)擬定的依賴管理文件,用于替代過于簡陋的 requirements.txt
文件。
基本理念
-
Pipfile
文件是 TOML 格式而不是requirements.txt
這樣的純文本; - 一個項目對應(yīng)一個
Pipfile
,支持開發(fā)環(huán)境與正式環(huán)境區(qū)分。默認提供default
和development
區(qū)分; - 提供版本鎖支持,存為
Pipfile.lock
。
示例:
[[source]]
url = 'https://pypi.python.org/simple'
verify_ssl = true
[requires]
python_version = '2.7'
[packages]
requests = { extras = ['socks'] }
Django = '>1.10'
pinax = { git = 'git://github.com/pinax/pinax.git', ref = '1.4', editable = true }
[dev-packages]
nose = '*'
PEP 508 支持
可以設(shè)置支持的運行環(huán)境:
[requires]
python_full_version = '3.6.0b1'
platform = 'windows'
pip 支持
From WoHowLearn 提醒,pip 最新版 19.2.1 已不支持 Pipfile, 參數(shù) -p
/ --pipfile
也已經(jīng)被移除。
pip 提供了 -p
/ --pipfile
參數(shù)用于安裝 Pipfile
,類似 -r
/ --requirement
會默認尋找 requirements.txt
文件,如果沒有指定 -p
的參數(shù)將會自動尋找 Pipfile
文件。
例如:
pip install -p # 沒有參數(shù)會自動尋找 Pipfile 文件
pip install -p Pipfile.lock # 根據(jù) Pipfile.lock 安裝指定依賴
需要注意的是,pip install -p
安裝時會自動生成或更新 Pipfile.lock
文件。
Pipfile.lock
Pipfile.lock
是根據(jù) Pipfile
和當前環(huán)境自動生成的 JSON 格式的依賴文件,任何情況下都不要手動修改該文件!
生成命令:pip freeze -p Pipfile
。
或者:pip freeze -p different_pipfile
,將會生成 different_pipfile.lock
。
virtualenv
一般情況,每個應(yīng)用都需要各自擁有一套“獨立”的Python運行環(huán)境。virtualenv就是用來為一個應(yīng)用創(chuàng)建一套“隔離”的Python運行環(huán)境。
安裝 virtualenv:
pip3 install virtualenv
-
進入項目目錄,創(chuàng)建獨立的 Python 運行環(huán)境,命名為
venv
:
virtualenv -p python3 --no-site-packages venv
命令virtualenv
會創(chuàng)建一個獨立的 Python 運行環(huán)境- 參數(shù)
-p python3
將創(chuàng)建 python3 環(huán)境,而不是 python2; - 參數(shù)
--no-site-packages
表明不復制已經(jīng)安裝到系統(tǒng) Python 環(huán)境中的所有第三方包,這樣就得到了一個不帶任何第三方包的「干凈」的 Python 運行環(huán)境。
新的 Python 環(huán)境被放到當前目錄下的
venv
目錄。 - 參數(shù)
建立好環(huán)境后,進入該環(huán)境:
source venv/bin/activate
命令提示符將會變化,有個(venv)
前綴,表示當前環(huán)境是一個名為 venv 的 Python 環(huán)境。
在 venv 環(huán)境下,用 pip 安裝的包都被安裝到 venv 這個環(huán)境下,系統(tǒng) Python 環(huán)境不受任何影響。退出當前的 venv 環(huán)境
deactivate
此時就回到了正常的環(huán)境,現(xiàn)在pip
或python
均是在系統(tǒng) Python 環(huán)境下執(zhí)行。
針對每個應(yīng)用創(chuàng)建獨立的Python運行環(huán)境,這樣就可以對每個應(yīng)用的Python環(huán)境進行隔離。
virtualenv 是如何創(chuàng)建「獨立」的 Python 運行環(huán)境的呢?
原理很簡單,就是把系統(tǒng) Python 復制一份到virtualenv
的環(huán)境,用命令source venv/bin/activate
進入一個virtualenv
環(huán)境時,virtualenv
會修改相關(guān)環(huán)境變量,讓命令python
和pip
均指向當前的virtualenv環(huán)境。
pipenv
pipenv 是 Pipfile
主要倡導者,requests
作者 Kenneth Reitz 的一個庫,有機地結(jié)合了 Pipfile
,pip
,和virtualenv
。
主要特征
- 根據(jù)
Pipfile
自動尋找項目根目錄; - 如果不存在,可以自動生成
Pipfile
和Pipfile.lock
; - 自動在項目目錄的
.venv
目錄創(chuàng)建虛擬環(huán)境。(暫時需要設(shè)置export PIPENV_VENV_IN_PROJECT=1
); - 自動管理
Pipfile
新安裝和刪除的包; - 自動更新 pip。
基本命令
-
pipenv --where
:尋找項目根目錄; -
pipenv install
:安裝Pipfile
中所列的所有包; -
pipenv install --dev
:安裝Pipfile
中dev
環(huán)境所列的所有包; -
pipenv uninstall
:卸載所有包; -
pipenv install pytest --dev
:在dev
環(huán)境中安裝 pytest 包; -
pipenv lock
:確認Pipfile
中所有包已安裝,并根據(jù)安裝版本生成Pipfile.lock
; -
pipenv shell
:應(yīng)用虛擬環(huán)境。
自動補全
由于 pipenv 的命令行程序是基于 Click 庫,因此自帶了 Bash 補全功能,只需要運行或者將這行代碼加入 Bash 啟動腳本:eval "$(_FOO_BAR_COMPLETE=source foo-bar)"
。
對于 Zsh,需要將這行代碼改為 eval "$(_PIPENV_COMPLETE=source-zsh pipenv)"
。
最后,Pipfile
和 pipenv
仍然是實驗性特性,可能存在不穩(wěn)定性和較大變動,注意關(guān)注最新變化!。