【发布时间】:2019-05-24 20:21:42
【问题描述】:
如何列出我使用pip 直接安装的软件包,从而省略任何已安装的依赖项?
我有一个在其中运行的 virtualenv,类似的命令
$ pip install A B C
$ pip install X Y Z
因此,我不仅安装了 A、B、C、X、Y 和 Z,还安装了依赖项 p、q、r、s、t、u、v 和 w。但是查看任何给定的软件包,我不记得它是否是我直接安装的。我想保持这个 venv 中直接安装的包是最新的,比如
$ pip install -U --directly-installed
有这样的效果
$ pip install -U A B C X Y Z
有没有办法让直接安装的软件包保持最新状态(仅根据这些软件包的要求更新它们的依赖关系)?
【问题讨论】:
-
你不能,因为
pip不会跟踪软件包是显式安装还是作为依赖项安装。使用pipdeptree或pip-chill之类的工具,您可以获得“顶级”包的列表,因为它们不是某些其他包的依赖项。这些肯定是您明确安装的(pip、setuptools和wheel除外,如果您在 venv 中)。 -
然而,这个列表不够完整/可靠——例如想象你
pip install numpy,然后是pip install scipy。现在,虽然numpy已显式安装,但它成为scipy的依赖项,因此不再列为“顶级”包。 -
@hoefling 这听起来像是答案:我需要返回并冻结,找出我直接安装的内容,修剪
requirements.txt,然后只修剪pip -U requirements.txt。对吗? -
是的。在你有一个干净的需求文件之后,将它作为一种“世界”文件来处理,你可以在其中放置所有要安装的包,正如@phd 在他的回答中所描述的那样:
pkg的安装现在就像echo pkg >> world.txt && pip install -r world.txt一样。
标签: pip