Reproduce from pip 与 Pipfile,virtualenv
pip 是什么?
pip 是一个 Python 包也是 Python 推荐的包管理程序,可以用于安装和管理 Python 包,Python 2.7.9+ 版本中已经自带了 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; - 指定版本号区间:
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
Pipfile 与 Pipfile.lock 是社区拟定的依赖管理文件,用于替代过于简陋的 requirements.txt 文件。
基本理念
-
Pipfile文件是 TOML 格式而不是requirements.txt这样的纯文本; - 一个项目对应一个
Pipfile,支持开发环境与正式环境区分。默认提供default和development区分; - 提供版本锁支持,存为
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运行环境。
安装 virtualenv:
pip3 install virtualenv-
进入项目目录,创建独立的 Python 运行环境,命名为
venv:
virtualenv -p python3 --no-site-packages venv
命令virtualenv会创建一个独立的 Python 运行环境- 参数
-p python3将创建 python3 环境,而不是 python2; - 参数
--no-site-packages表明不复制已经安装到系统 Python 环境中的所有第三方包,这样就得到了一个不带任何第三方包的「干净」的 Python 运行环境。
新的 Python 环境被放到当前目录下的
venv目录。 - 参数
建立好环境后,进入该环境:
source venv/bin/activate
命令提示符将会变化,有个(venv)前缀,表示当前环境是一个名为 venv 的 Python 环境。
在 venv 环境下,用 pip 安装的包都被安装到 venv 这个环境下,系统 Python 环境不受任何影响。退出当前的 venv 环境
deactivate
此时就回到了正常的环境,现在pip或python均是在系统 Python 环境下执行。
针对每个应用创建独立的Python运行环境,这样就可以对每个应用的Python环境进行隔离。
virtualenv 是如何创建「独立」的 Python 运行环境的呢?
原理很简单,就是把系统 Python 复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。
pipenv
pipenv 是 Pipfile 主要倡导者,requests 作者 Kenneth Reitz 的一个库,有机地结合了 Pipfile,pip,和virtualenv。
主要特征
- 根据
Pipfile自动寻找项目根目录; - 如果不存在,可以自动生成
Pipfile和Pipfile.lock; - 自动在项目目录的
.venv目录创建虚拟环境。(暂时需要设置export PIPENV_VENV_IN_PROJECT=1); - 自动管理
Pipfile新安装和删除的包; - 自动更新 pip。
基本命令
-
pipenv --where:寻找项目根目录; -
pipenv install:安装Pipfile中所列的所有包; -
pipenv install --dev:安装Pipfile中dev环境所列的所有包; -
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)"。
最后,Pipfile 和 pipenv 仍然是实验性特性,可能存在不稳定性和较大变动,注意关注最新变化!。