美文网首页
Pipfile 文件转换利器——pipfile-freeze

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

作者: mocobk | 来源:发表于2020-02-10 18:35 被阅读0次

    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
                            
    

    相关文章

      网友评论

          本文标题:Pipfile 文件转换利器——pipfile-freeze

          本文链接:https://www.haomeiwen.com/subject/giqzxhtx.html