pipfile-freeze 是一个将 Pipfile/Pipfile.lock 文件快速转换为
Requirments 文件格式的命令行工具
其实在写这个工具之前已有相应的工具问世——pipfile-requirements,该工具的作者 @frostming 也是 pipenv 的维护成员之一,此时你也会发出疑问,既然都有现成的工具了那为什么还要重新造一个轮子呢?其实我并没有在重新造轮子,而是在原有的轮子上做了一些完善。
为什么需要这个轮子?
我们知道 Python 的虚拟环境管理工具有很多,不同的工具它的依赖管理方式也不一样,但大部分都会兼容官方 pip 的 Requirments 文件格式。举个栗子,我之前用的 Pipenv 管理了一个项目的虚拟环境,现在改用 conda 来管理,这时为了能把项目所有的依赖安装上,我需要在原来的项目中导出 requirements.txt
文件,然后再通过 conda install --file requirements.txt
来安装所有的依赖。
另外,Pipenv 在安装依赖的时候是还是比较慢的(很多人也是因为这个才放弃了 Pipenv),如果在我们正式环境部署中也采用 Pipenv 管理的方式,会占用太多的时间,同时也会显得多余,尤其是在采用 docker 方式去部署时。这种情况下我们一般只需提供一份 requirements.txt 文件来告诉持续集成工具或生产服务器应安装哪些依赖包和版本。
如何从 Pipenv 虚拟环境中导出 requirements.txt
?
假设我项目中 Pipfile 是这样的:
[[source]]
name = "douban"
url = "https://pypi.doubanio.com/simple"
verify_ssl = true
[dev-packages]
[packages]
pypdf2 = ">=1.17,<=1.23"
requests = "*"
[requires]
python_version = "3.7"
1. 简单暴力法:
在虚拟环境中直接运行:
pip freeze > requirements.txt
得到的结果是:
certifi==2019.11.28
chardet==3.0.4
idna==2.8
PyPDF2==1.23
requests==2.22.0
urllib3==1.25.8
缺点:
(1)会把依赖及子依赖都导出,显得冗余;
(2)得到的是当前环境明确的版本,即不是一个版本范围,有些不需要锁定版本的也被锁定了
(3)没有导出安装源
2. 利用 Pipenv 自带的工具导出:
pipenv lock -r > requirements.txt
导出结果:
-i https://pypi.doubanio.com/simple
certifi==2019.11.28
chardet==3.0.4
idna==2.8
pypdf2==1.23
requests==2.22.0
urllib3==1.25.8
跟方案一差不多,但可以导出安装源
3. pipfile-requirements 工具转换
pipfile2req Pipfile > requirements.txt
输出结果:
pypdf2<=1.23,>=1.17
requests
这下简洁多了,只输出了我们需要的两个依赖,并且有版本范围,可惜的是没有导出安装源呀。
使用 pipenv-freeze
pipenv-freeze 工具是在 pipfile-requirements 的基础上优化的,主要有以下改进:
- 增加支持安装源的导出;
- 增加
-o
参数,直接生成requirements.txt
文件; - 修改命令名为
pipenv freeze
,主要考虑与pip freeze
保持一致,更容易理解用途。
安装
$ pip install pipfile-freeze
转换 Pipfile
上面的栗子中,用 pipenv-freeze 工具导出则是这样的:
pipfile freeze Pipfile -o
输出结果
--index-url https://pypi.doubanio.com/simple
pypdf2>=1.17,<=1.23
requests
更多用法
$ pipfile freeze --help
usage: pipfile freeze [-h] [-p PROJECT] [--hashes] [-d] [-o [file]] [file]
positional arguments:
file The file path to convert, support both Pipfile and
Pipfile.lock. If it isn't given, will try Pipfile.lock
first then Pipfile.
optional arguments:
-h, --help show this help message and exit
-p PROJECT, --project PROJECT
Specify another project root
--hashes whether to include the hashes
-d, --dev whether to choose both develop and default packages
-o [file], --outfile [file]
Output requirements to the file
网友评论