【问题标题】:Pip freeze vs. pip list点冻结与点列表
【发布时间】:2013-09-28 18:44:44
【问题描述】:

输出的比较揭示了差异:

user@user-VirtualBox:~$ pip list
feedparser (5.1.3)
pip (1.4.1)
setuptools (1.1.5)
wsgiref (0.1.2)
user@user-VirtualBox:~$ pip freeze
feedparser==5.1.3
wsgiref==0.1.2

Pip 的文档状态

freeze                      Output installed packages in requirements format.
list                        List installed packages.

但什么是“需求格式”,为什么pip list 生成的列表比pip freeze 更全面?

【问题讨论】:

标签: python python-2.7 python-3.x pip


【解决方案1】:

当您使用virtualenv 时,您可以指定requirements.txt 文件来安装所有依赖项。

典型用法:

$ pip install -r requirements.txt

包需要有特定的格式供pip理解,即

feedparser==5.1.3
wsgiref==0.1.2
django==1.4.2
...

即“需求格式”。

这里,django==1.4.2 意味着安装 django 版本 1.4.2(即使最新的是 1.6.x)。 如果您不指定==1.4.2,将安装可用的最新版本。

您可以在“Virtualenv and pip Basics”中阅读更多内容, 以及官方的“Requirements File Format”文档。

【讨论】:

  • 知道了。为什么“list”比“freeze”产生更全面的列表有什么特别的原因吗?
  • 我认为这是因为pip list 列出了所有内容,而pip freeze 安装了pip 安装的所有内容。
  • Python 3.2 在 Lib 目录中包含 wsgiref.egg-info,这就是 pip 知道它的原因。你不能用 pip [un] 安装它,并且更高版本的 Python 省略了元数据文件,所以它不会出现。
  • @leonid 如果你去掉最后的版本号,它将从 pypi 安装最新版本。完整阅读答案
  • 这个答案没有解决问题中最令人费解的部分——为什么这两个列表不同?它只解决了问题中不言而喻的部分——需求格式是“pip freeze”输出的格式,问题中显示了一个示例。
【解决方案2】:

主要区别在于pip freeze 的输出可以转储到 requirements.txt 文件中,然后用于重新构建“冻结”环境。

换句话说,您可以运行: pip freeze > frozen-requirements.txt 在一台机器上,然后在另一台机器上或在干净的环境上你可以这样做: pip install -r frozen-requirements.txt 您将获得与您在生成 freeze-requirements.txt 的原始环境中安装的完全相同的依赖项的相同环境。

【讨论】:

    【解决方案3】:

    为了回答这个问题的第二部分,pip list 中显示的但不是pip freeze 的两个包是setuptools(即easy_install)和pip 本身。

    看起来pip freeze 只是没有列出 pip 本身所依赖的包。您也可以使用--all 标志来显示这些包。

    来自the documentation:

    --all

    不要在输出中跳过这些包:pip、setuptools、distribute、wheel

    【讨论】:

    【解决方案4】:

    查看pip documentation,它将两者的功能描述为:

    点子列表

    列出已安装的包,包括可编辑的。

    点冻结

    以需求格式输出已安装的包。

    所以有两个区别:

    1. 输出格式,freeze 为我们提供了标准的需求格式,以后可以与 pip install -r 一起使用来安装需求。

    2. 输出内容,pip list 包含 pip freeze 不包含的可编辑内容。

    【解决方案5】:

    pip list 显示 所有 已安装的软件包。

    pip freeze 以需求格式显示通过pip(或pipenv,如果使用该工具)命令安装的软件包YOU。

    备注 setuptools, pip, wheel 在pipenv shell 创建我的虚拟信封时安装。这些软件包不是由我使用pip 安装的:

    test1 % pipenv shell
    Creating a virtualenv for this project…
    Pipfile: /Users/terrence/Development/Python/Projects/test1/Pipfile
    Using /usr/local/Cellar/pipenv/2018.11.26_3/libexec/bin/python3.8 (3.8.1) to create virtualenv…
    ⠹ Creating virtual environment...
    <SNIP>
    Installing setuptools, pip, wheel...
    done.
    ✔ Successfully created virtual environment! 
    <SNIP>
    

    现在查看并比较我只安装了 cool-lib 和 sampleproject 的各个命令的输出em>(其中 peppercorn 是一个依赖项):

    test1 % pip freeze       <== Packages I'VE installed w/ pip
    
    -e git+https://github.com/gdamjan/hello-world-python-package.git@10<snip>71#egg=cool_lib
    peppercorn==0.6
    sampleproject==1.3.1
    
    
    test1 % pip list         <== All packages, incl. ones I've NOT installed w/ pip
    
    Package       Version Location                                                                    
    ------------- ------- --------------------------------------------------------------------------
    cool-lib      0.1  /Users/terrence/.local/share/virtualenvs/test1-y2Zgz1D2/src/cool-lib           <== Installed w/ `pip` command
    peppercorn    0.6       <== Dependency of "sampleproject"
    pip           20.0.2  
    sampleproject 1.3.1     <== Installed w/ `pip` command
    setuptools    45.1.0  
    wheel         0.34.2
    

    【讨论】:

    • pip list - 显示已安装的软件包,而不是全部。查看官方文档和 Daniel Lahyani 的答案。
    • @filler36:我认为“已安装”是隐含的,但仍然结合了您的反馈以确保歧义不会造成潜在的混淆。感谢您的反馈,非常感谢!-T
    【解决方案6】:

    对于那些正在寻找解决方案的人。如果您不小心将pip 要求使用pip list 而不是pip freeze,并希望转换为pip freeze 格式。我为此编写了这个 R 脚本。

    library(tidyverse)
    
    pip_list = read_lines("requirements.txt")
    
    pip_freeze = pip_list %>%
      str_replace_all(" \\(", "==") %>%
      str_replace_all("\\)$", "")
    
    pip_freeze %>% write_lines("requirements.txt")
    

    【讨论】:

      【解决方案7】:

      我首选的生成需求文件的方法是:

      pip list --format=freeze > requirements.txt
      

      此方法仅保留包名称和包版本,而不会潜在地链接到本地​​文件路径,仅“pip freeze”有时会给我。需求文件中的本地文件路径使您的代码库更难被其他用户使用,并且一些开发人员不知道如何解决这个问题,所以我更喜欢这种方法以便于采用。

      【讨论】:

        【解决方案8】:
        pip list
        

        列出已安装的包:显示 所有 已安装的包,甚至 pip 隐式安装的包

        pip freeze
        

        列出已安装的软件包:- 使用 pip 命令安装的软件包列表

        pip freeze 有--all 标志来显示所有的包。

        其他区别在于它呈现的输出,您可以通过运行命令来检查。

        【讨论】:

          猜你喜欢
          • 2019-07-22
          • 1970-01-01
          • 1970-01-01
          • 2017-11-01
          • 2017-05-02
          • 1970-01-01
          • 1970-01-01
          • 2012-03-23
          • 1970-01-01
          相关资源
          最近更新 更多