Pip freeze vs. pip list

204

为什么pip list会生成比pip freeze更全面的列表?

$ pip list
feedparser (5.1.3)
pip (1.4.1)
setuptools (1.1.5)
wsgiref (0.1.2)
$ pip freeze
feedparser==5.1.3
wsgiref==0.1.2

Pip的文档说明:

   
freeze 以requirements格式输出已安装的软件包。
list 列出已安装的软件包。

"requirements格式"是什么?


5
请参考这些文档:docs - alecxe
截至目前为止,文档已经更新。点击此处查看最新文档。 - Karl Knechtel
8个回答

181

可以通过以下方式生成requirements.txt

$ pip freeze > requirements.txt

用户可以使用此requirements.txt文件安装所有依赖项。例如:

$ pip install -r requirements.txt

软件包需要符合特定的格式才能被pip理解,例如:

# requirements.txt
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 和 pip 基础知识”中了解更多信息, 以及官方的“需求文件格式”文档。


10
明白了。为什么“list”会比“freeze”生成更全面的清单?是否有特别的原因? - nitrl
2
我认为这是因为pip list列出了所有内容,而pip freeze安装了由pip安装的所有内容。 - karthikr
1
Python 3.2在Lib目录中包含“wsgiref.egg-info”,所以pip知道它的存在。您无法使用pip [卸载]它,并且较新版本的Python省略了元数据文件,因此它不会出现。 - Zooba
1
@leonid 如果你去掉末尾的版本号,它会从pypi安装最新版本。请完整阅读答案。 - karthikr
12
这个回答没有解决问题中最令人困惑的部分——为什么这两个列表不同?它只回答了问题中显而易见的部分——"requirements format" 是由“pip freeze”输出的格式,其中问题中给出了一个示例。 - Jonathan Hartley
显示剩余4条评论

72
为了回答这个问题的第二部分,pip list 中但不在 pip freeze 中显示的两个包分别是 setuptools(即 easy_install)和 pip 本身。
看起来 pip freeze 只是没有列出 pip 本身所依赖的包。您可以使用 --all 标志来显示这些包。
文档中可以得知:

--all

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


4
pip freeze命令有一个选项--all,可以显示出pip、setuptools、distribute和wheel等所有安装的软件包。详见:https://pip.pypa.io/en/stable/reference/pip_freeze/ - Chananel P
分布式 less - Max Kleiner

61

主要区别是pip freeze的输出可以导出到requirements.txt文件中,以便稍后重新构建“冻结”的环境。

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


31

请查看pip文档,其中描述了两者的功能:

pip list

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

pip freeze

以requirements格式输出已安装的包。

因此这里有两个区别:

  1. 输出格式,freeze 给出标准的requirements格式,可以与后面的 pip install -r 一起使用来安装requirements。

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


1
https://pip.pypa.io/en/stable/reference/pip_install/#install-editable - Serjik

20

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

pip freeze 显示你通过pip(或使用pipenv工具的情况下)命令以requirements格式安装的包。

请注意,当pipenv shell创建我的虚拟环境时,setuptoolspipwheel被安装,这些包不是由我使用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(其中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
2
@filler36:我认为“已安装”是可以暗示的,但仍然采纳了您的反馈,以确保歧义不会造成潜在的混淆。非常感谢您的反馈!- T - F1Linux
1
pip freeze显示通过pip安装的软件包。在Linux上这是错误的!list和freeze都会显示所有软件包,包括系统包管理器安装的软件包(不是你安装的)。pip freeze只会省略(setuptools, wheel, pip, distribute)这几个软件包,但有一个all选项可以包含它们。文档链接 - j77h
1
pip freeze显示通过pip安装的软件包。在Linux上,这是错误的!list和freeze都会显示所有软件包,包括系统包管理器安装的软件包(这不是你安装的)。pip freeze只会省略(setuptools, wheel, pip, distribute)这几个软件包,但它有一个all选项可以包括它们。文档 - undefined

17

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

pip list --format=freeze > requirements.txt

这种方法仅保留软件包的名称和版本,而不会像单独使用'pip freeze'时那样可能链接到本地文件路径。在要求文件中使用本地文件路径会使您的代码库对其他用户更难使用,有些开发人员不知道如何解决这个问题,因此我更喜欢这种易于采用性的方法。


1
“pip list --not-required --format=freeze > requirements.txt” 这个命令不是更好吗?因为它只包含顶级依赖项。 - dijonkitchen
@dijonkitchen 谢谢你的建议!我还没有深入研究过使用这个标志,但我认为它可能会使要求文件更加清晰易懂。我看到有一些问题报告称它缺少某些特定的依赖项,这可能是一个潜在的问题,但可能很少见。总的来说,我支持明确的环境配置和最小化非确定性决策,所以我认为在像科学计算这样的数据质量关键应用中,列出所有依赖项是有用的,但对于大多数应用程序,顶层就足够了。 - colby-ham
1
是的,如果某些顶级依赖项也嵌套在另一个依赖项中,则可能会被排除在外。我认为显式依赖项一直到底部唯一的问题是很难升级,并且当嵌套依赖项发生变化时,您可能会有多余的不再需要的依赖项。 - dijonkitchen
1
我个人认为这是最有用的命令,原因如下所述。在不同的软件包管理器之间明确且灵活。 - undefined

1
pip list

列出已安装的软件包:显示所有已安装的软件包,即使是由pip隐式安装的。
pip freeze

列出已安装的包:- 使用pip命令安装的包列表 pip freeze具有--all标志以显示所有软件包。
另一个区别是它呈现的输出,您可以通过运行命令来检查。

在Linux上,list和freeze命令都会显示所有的软件包,包括系统包管理器安装的软件包(即不是通过pip或您自己安装的)。而pip freeze命令只会省略(setuptools, wheel, pip, distribute)这几个软件包。 - j77h

0

对于那些正在寻找解决方案的人。如果您意外用 pip list 而不是 pip freeze 创建了 pip 需求,并想要将其转换为 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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接