点冻结与点列表
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, 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
标志来显示所有的包。
其他区别在于它呈现的输出,您可以通过运行命令来检查。
【讨论】:
以上是关于点冻结与点列表的主要内容,如果未能解决你的问题,请参考以下文章