点冻结与点列表

Posted

技术标签:

【中文标题】点冻结与点列表【英文标题】: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 更全面?

【问题讨论】:

仅供参考,这里是docs。 Up to date documentation 截至目前。 【参考方案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

【讨论】:

pip freeze 有一个选项 --all 也可以显示:pip, setuptools, distribute, wheel pip.pypa.io/en/stable/reference/pip_freeze 少分发【参考方案4】:

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

点子列表

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

点冻结

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

所以有两个区别:

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

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

【讨论】:

pip.pypa.io/en/stable/reference/pip_install/#install-editable【参考方案5】:

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

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

备注 setuptools, pip, wheelpipenv 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-libsampleproject 的各个命令的输出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 标志来显示所有的包。

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

【讨论】:

以上是关于点冻结与点列表的主要内容,如果未能解决你的问题,请参考以下文章

为啥 pip 冻结列表“pkg-resources==0.0.0”?

QtQuick 动画冻结在列表和打开的串口上

更新 CListCtrl 时 MFC 应用程序冻结

如何在Excel数据中间插入数据而不覆盖原有数据?

查找与点相交的圆[重复]

excel怎么让前三行一直显示?