该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 的基础上优化的,主要有以下改进:
- 增加支持安装源的导出;
- 增加
-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
参考链接:https://www.jianshu.com/p/b7644a1fb503