Pipfile 文件转换利器——pipfile-freeze

Pipfile.lock是用来规定的基础上,目前在包装Pipfile,应该使用那些特定版本,避免依赖于对方,破坏你的项目的依赖关系树自动升级包的风险。

您可以使用...锁定当前安装的软件包

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 的基础上优化的,主要有以下改进:

  1. 增加支持安装源的导出;
  2. 增加 -o 参数,直接生成 requirements.txt 文件;
  3. 修改命令名为 pipenv freeze ,主要考虑与 pip freeze 保持一致,更容易理解用途。

GitHub地址

安装
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
                        

参考链接:https://www.jianshu.com/p/b7644a1fb503