pip 與 Pipfile

Reproduce from pip 與 Pipfilevirtualenv

pip 是什么?

pip 是一個 Python 包也是 Python 推薦的包管理程序,可以用于安裝和管理 Python 包,Python 2.7.9+ 版本中已經(jīng)自帶了 pip 包。針對 Python 2 和 3,pip 分別提供了 pippip3 兩個命令。

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

PipfilePipfile.lock 是社區(qū)擬定的依賴管理文件,用于替代過于簡陋的 requirements.txt 文件。

基本理念

  • Pipfile 文件是 TOML 格式而不是 requirements.txt 這樣的純文本;
  • 一個項目對應(yīng)一個 Pipfile,支持開發(fā)環(huán)境與正式環(huán)境區(qū)分。默認提供 defaultdevelopment 區(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)境。

  1. 安裝 virtualenv:
    pip3 install virtualenv

  2. 進入項目目錄,創(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 目錄。

  3. 建立好環(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)境不受任何影響。

  4. 退出當前的 venv 環(huán)境
    deactivate
    此時就回到了正常的環(huán)境,現(xiàn)在 pippython 均是在系統(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)境變量,讓命令 pythonpip 均指向當前的virtualenv環(huán)境。

pipenv

pipenvPipfile 主要倡導者,requests 作者 Kenneth Reitz 的一個庫,有機地結(jié)合了 Pipfilepip,和virtualenv

主要特征

  • 根據(jù) Pipfile 自動尋找項目根目錄;
  • 如果不存在,可以自動生成 PipfilePipfile.lock
  • 自動在項目目錄的 .venv 目錄創(chuàng)建虛擬環(huán)境。(暫時需要設(shè)置 export PIPENV_VENV_IN_PROJECT=1);
  • 自動管理 Pipfile 新安裝和刪除的包;
  • 自動更新 pip。

基本命令

  • pipenv --where:尋找項目根目錄;
  • pipenv install:安裝 Pipfile 中所列的所有包;
  • pipenv install --dev:安裝 Pipfiledev 環(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)"

最后,Pipfilepipenv 仍然是實驗性特性,可能存在不穩(wěn)定性和較大變動,注意關(guān)注最新變化!。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容