pip 与 Pipfile

Reproduce from pip 与 Pipfilevirtualenv

pip 是什么?

pip 是一个 Python 包也是 Python 推荐的包管理程序,可以用于安装和管理 Python 包,Python 2.7.9+ 版本中已经自带了 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
  • 指定版本号区间:pip install SomePackage>=1.0.0,<2.0.0

pip 也支持直接从文件读取包列表一边批量安装,通常命名为 requirements.txt,可以使用 pip install -r requirements.txt 来安装。requirements.txt 文件内容是如下的扁平格式:

SomePackage1
SomePackage2>=1.0.0
SomePackage3>=1.0.0,<2.0.0

Pipfile 与 Pipfile.lock

PipfilePipfile.lock 是社区拟定的依赖管理文件,用于替代过于简陋的 requirements.txt 文件。

基本理念

  • Pipfile 文件是 TOML 格式而不是 requirements.txt 这样的纯文本;
  • 一个项目对应一个 Pipfile,支持开发环境与正式环境区分。默认提供 defaultdevelopment 区分;
  • 提供版本锁支持,存为 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 支持

可以设置支持的运行环境:

[requires]
python_full_version = '3.6.0b1'

platform = 'windows'

pip 支持

From WoHowLearn 提醒,pip 最新版 19.2.1 已不支持 Pipfile, 参数 -p / --pipfile 也已经被移除
pip 提供了 -p / --pipfile 参数用于安装 Pipfile,类似 -r / --requirement 会默认寻找 requirements.txt 文件,如果没有指定 -p 的参数将会自动寻找 Pipfile 文件。

例如:

pip install -p    # 没有参数会自动寻找 Pipfile 文件
pip install -p Pipfile.lock  # 根据 Pipfile.lock 安装指定依赖

需要注意的是,pip install -p 安装时会自动生成或更新 Pipfile.lock 文件。

Pipfile.lock

Pipfile.lock 是根据 Pipfile 和当前环境自动生成的 JSON 格式的依赖文件,任何情况下都不要手动修改该文件!

生成命令:pip freeze -p Pipfile

或者:pip freeze -p different_pipfile,将会生成 different_pipfile.lock

virtualenv

一般情况,每个应用都需要各自拥有一套“独立”的Python运行环境。virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。

  1. 安装 virtualenv:
    pip3 install virtualenv

  2. 进入项目目录,创建独立的 Python 运行环境,命名为 venv
    virtualenv -p python3 --no-site-packages venv
    命令 virtualenv 会创建一个独立的 Python 运行环境

    • 参数 -p python3 将创建 python3 环境,而不是 python2;
    • 参数 --no-site-packages 表明不复制已经安装到系统 Python 环境中的所有第三方包,这样就得到了一个不带任何第三方包的「干净」的 Python 运行环境。

    新的 Python 环境被放到当前目录下的 venv 目录。

  3. 建立好环境后,进入该环境:
    source venv/bin/activate
    命令提示符将会变化,有个 (venv) 前缀,表示当前环境是一个名为 venv 的 Python 环境。
    在 venv 环境下,用 pip 安装的包都被安装到 venv 这个环境下,系统 Python 环境不受任何影响。

  4. 退出当前的 venv 环境
    deactivate
    此时就回到了正常的环境,现在 pippython 均是在系统 Python 环境下执行。

针对每个应用创建独立的Python运行环境,这样就可以对每个应用的Python环境进行隔离。

virtualenv 是如何创建「独立」的 Python 运行环境的呢?
原理很简单,就是把系统 Python 复制一份到 virtualenv 的环境,用命令 source venv/bin/activate 进入一个 virtualenv 环境时,virtualenv 会修改相关环境变量,让命令 pythonpip 均指向当前的virtualenv环境。

pipenv

pipenvPipfile 主要倡导者,requests 作者 Kenneth Reitz 的一个库,有机地结合了 Pipfilepip,和virtualenv

主要特征

  • 根据 Pipfile 自动寻找项目根目录;
  • 如果不存在,可以自动生成 PipfilePipfile.lock
  • 自动在项目目录的 .venv 目录创建虚拟环境。(暂时需要设置 export PIPENV_VENV_IN_PROJECT=1);
  • 自动管理 Pipfile 新安装和删除的包;
  • 自动更新 pip。

基本命令

  • pipenv --where:寻找项目根目录;
  • pipenv install:安装 Pipfile 中所列的所有包;
  • pipenv install --dev:安装 Pipfiledev 环境所列的所有包;
  • pipenv uninstall:卸载所有包;
  • pipenv install pytest --dev:在 dev 环境中安装 pytest 包;
  • pipenv lock:确认 Pipfile 中所有包已安装,并根据安装版本生成 Pipfile.lock
  • pipenv shell:应用虚拟环境。

自动补全

由于 pipenv 的命令行程序是基于 Click 库,因此自带了 Bash 补全功能,只需要运行或者将这行代码加入 Bash 启动脚本:eval "$(_FOO_BAR_COMPLETE=source foo-bar)"

对于 Zsh,需要将这行代码改为 eval "$(_PIPENV_COMPLETE=source-zsh pipenv)"

最后,Pipfilepipenv 仍然是实验性特性,可能存在不稳定性和较大变动,注意关注最新变化!。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容