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ū)分恭金。默認(rèn)提供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è)置支持的運(yùn)行環(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
會默認(rèn)尋找 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
和當(dāng)前環(huán)境自動生成的 JSON 格式的依賴文件,任何情況下都不要手動修改該文件纫塌!
生成命令:pip freeze -p Pipfile
诊县。
或者:pip freeze -p different_pipfile
,將會生成 different_pipfile.lock
措左。
virtualenv
一般情況依痊,每個應(yīng)用都需要各自擁有一套“獨(dú)立”的Python運(yùn)行環(huán)境。virtualenv就是用來為一個應(yīng)用創(chuàng)建一套“隔離”的Python運(yùn)行環(huán)境媳荒。
安裝 virtualenv:
pip3 install virtualenv
-
進(jìn)入項目目錄抗悍,創(chuàng)建獨(dú)立的 Python 運(yùn)行環(huán)境,命名為
venv
:
virtualenv -p python3 --no-site-packages venv
命令virtualenv
會創(chuàng)建一個獨(dú)立的 Python 運(yùn)行環(huán)境- 參數(shù)
-p python3
將創(chuàng)建 python3 環(huán)境钳枕,而不是 python2缴渊; - 參數(shù)
--no-site-packages
表明不復(fù)制已經(jīng)安裝到系統(tǒng) Python 環(huán)境中的所有第三方包,這樣就得到了一個不帶任何第三方包的「干凈」的 Python 運(yùn)行環(huán)境鱼炒。
新的 Python 環(huán)境被放到當(dāng)前目錄下的
venv
目錄衔沼。 - 參數(shù)
建立好環(huán)境后,進(jìn)入該環(huán)境:
source venv/bin/activate
命令提示符將會變化昔瞧,有個(venv)
前綴指蚁,表示當(dāng)前環(huán)境是一個名為 venv 的 Python 環(huán)境。
在 venv 環(huán)境下自晰,用 pip 安裝的包都被安裝到 venv 這個環(huán)境下凝化,系統(tǒng) Python 環(huán)境不受任何影響。退出當(dāng)前的 venv 環(huán)境
deactivate
此時就回到了正常的環(huán)境酬荞,現(xiàn)在pip
或python
均是在系統(tǒng) Python 環(huán)境下執(zhí)行搓劫。
針對每個應(yīng)用創(chuàng)建獨(dú)立的Python運(yùn)行環(huán)境,這樣就可以對每個應(yīng)用的Python環(huán)境進(jìn)行隔離混巧。
virtualenv 是如何創(chuàng)建「獨(dú)立」的 Python 運(yùn)行環(huán)境的呢枪向?
原理很簡單,就是把系統(tǒng) Python 復(fù)制一份到virtualenv
的環(huán)境咧党,用命令source venv/bin/activate
進(jìn)入一個virtualenv
環(huán)境時秘蛔,virtualenv
會修改相關(guān)環(huán)境變量,讓命令python
和pip
均指向當(dāng)前的virtualenv環(huán)境傍衡。
pipenv
pipenv 是 Pipfile
主要倡導(dǎo)者深员,requests
作者 Kenneth Reitz 的一個庫,有機(jī)地結(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
:確認(rèn)Pipfile
中所有包已安裝,并根據(jù)安裝版本生成Pipfile.lock
鸽粉; -
pipenv shell
:應(yīng)用虛擬環(huán)境斜脂。
自動補(bǔ)全
由于 pipenv 的命令行程序是基于 Click 庫,因此自帶了 Bash 補(bǔ)全功能触机,只需要運(yùn)行或者將這行代碼加入 Bash 啟動腳本:eval "$(_FOO_BAR_COMPLETE=source foo-bar)"
帚戳。
對于 Zsh,需要將這行代碼改為 eval "$(_PIPENV_COMPLETE=source-zsh pipenv)"
儡首。
最后片任,Pipfile
和 pipenv
仍然是實(shí)驗(yàn)性特性,可能存在不穩(wěn)定性和較大變動蔬胯,注意關(guān)注最新變化对供!。