为什么
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 的文档指出:
冻结 | 以需求格式输出已安装的包。 |
列表 | 列出已安装的软件包。 |
什么是“需求格式”?
可以通过以下方式生成
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 基础知识”中阅读更多内容, 以及官方“需求文件格式”文档。
为了回答这个问题的第二部分,
pip list
中显示但不是pip freeze
中显示的两个软件包是setuptools
(即easy_install)和pip
本身。
看起来
pip freeze
只是没有列出pip本身所依赖的包。您还可以使用 --all
标志来显示这些包。
来自文档:
--all
不要在输出中跳过这些包:pip、setuptools、distribute、wheel
主要区别在于
pip freeze
的输出可以转储到requirements.txt文件中,并在以后用于重新构建“冻结”环境。
换句话说,你可以运行:
pip freeze > frozen-requirements.txt
在一台机器上,然后在另一台机器上或在干净的环境中,您可以执行以下操作:
pip install -r frozen-requirements.txt
您将获得一个相同的环境,并且安装了与生成 freeze-requirements.txt 的原始环境中完全相同的依赖项。
查看 pip 文档,其中将两者的功能描述为:
点列表
列出已安装的软件包,包括可编辑的软件包。
点冻结
以需求格式输出已安装的包。
所以有两个区别:
输出格式,
freeze
为我们提供了标准需求格式,稍后可以与pip install -r
一起使用来安装需求。输出内容,
pip list
包括pip freeze
不包含的可编辑内容。我生成需求文件的首选方法是:
pip list --format=freeze > requirements.txt
此方法仅保留包名称和包版本,而不会链接到本地文件路径,而“pip freeze”有时会单独提供给我。需求文件中的本地文件路径使您的代码库更难被其他用户使用,并且一些开发人员不知道如何解决此问题,因此我更喜欢这种方法,以便于采用。
pip list
显示ALL已安装的软件包。
pip freeze
显示通过 pip
(或 pipenv
,如果使用该工具)命令以需求格式安装的包 YOU。
请注意,当 pipenv shell
创建我的虚拟信封时,会安装 setuptools、pip、wheel
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(其中 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
而不是 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")
pip list
列出已安装的软件包:显示所有已安装的软件包,甚至是 pip 隐式安装的
pip freeze
列出已安装的软件包: - 使用 pip 命令安装的软件包列表
pip freeze 有
--all
标志来显示所有包。
其他区别是它呈现的输出,您可以通过运行命令进行检查。