为什么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格式"是什么?
为什么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格式"是什么?
可以通过以下方式生成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
安装了由pip安装的所有内容。 - karthikrpip list
中但不在 pip freeze
中显示的两个包分别是 setuptools
(即 easy_install)和 pip
本身。pip freeze
只是没有列出 pip 本身所依赖的包。您可以使用 --all
标志来显示这些包。
--all
在输出中不要跳过以下这些包:pip、setuptools、distribute、wheel。
pip freeze
命令有一个选项--all
,可以显示出pip、setuptools、distribute和wheel
等所有安装的软件包。详见:https://pip.pypa.io/en/stable/reference/pip_freeze/ - Chananel P主要区别是pip freeze
的输出可以导出到requirements.txt文件中,以便稍后重新构建“冻结”的环境。
换句话说,您可以在一台计算机上运行:pip freeze > frozen-requirements.txt
,然后稍后在另一台计算机或干净的环境中执行:pip install -r frozen-requirements.txt
,您将获得与生成frozen-requirements.txt的原始环境完全相同的依赖项安装的相同环境。
请查看pip文档,其中描述了两者的功能:
pip list
列出已安装的包,包括可编辑的包。
pip freeze
以requirements格式输出已安装的包。
因此这里有两个区别:
输出格式,freeze
给出标准的requirements格式,可以与后面的 pip install -r
一起使用来安装requirements。
输出内容,pip list
包含可编辑的包,而 pip freeze
不包含。
pip list
显示所有已安装的包。
pip freeze
显示你通过pip
(或使用pipenv
工具的情况下)命令以requirements格式安装的包。
请注意,当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 freeze
只会省略(setuptools, wheel, pip, distribute)这几个软件包,但有一个all
选项可以包含它们。文档链接。 - j77hpip freeze
只会省略(setuptools, wheel, pip, distribute)这几个软件包,但它有一个all
选项可以包括它们。文档。 - undefined我生成requirements文件的首选方法是:
pip list --format=freeze > requirements.txt
这种方法仅保留软件包的名称和版本,而不会像单独使用'pip freeze'时那样可能链接到本地文件路径。在要求文件中使用本地文件路径会使您的代码库对其他用户更难使用,有些开发人员不知道如何解决这个问题,因此我更喜欢这种易于采用性的方法。
pip list
pip freeze
对于那些正在寻找解决方案的人。如果您意外用 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")