pip是如何卸载你安装的第三方库的

使用pip uninstall 命令可以卸载掉你所安装的第三方库,所有与其相关的文件都将被pip整理出来展示并询问是否真的要删除,类似下面的提示

pip uninstall nox
Found existing installation: nox 2020.8.22
Uninstalling nox-2020.8.22:
  Would remove:
    d:\python\lib\site-packages\nox-2020.8.22.dist-info\*
    d:\python\lib\site-packages\nox\*
    d:\python\scripts\nox.exe
    d:\python\scripts\tox-to-nox.exe
Proceed (y/n)?

你是否好奇过,pip是如何知道一个库的相关文件所处位置的呢?

pkg_resources

pip底层依赖python原生模块pkg_resources,如果你对该模块足够熟悉,很多pip的功能,你自己就可以实现。

第三方模块有多种发行方式,不同的发行方式有自己独特的记录自身模块信息的方法。这里以whl安装文件为例,使用这种文件安装的第三方库会在site-packages里留下一个以dist-info为结尾的文件夹,在这个文件夹里,保留了该模块的许多信息。

这其中有一个名为RECORD的文本文件,里面存储的是这个模块的文件信息,包括文件的地址和sha256值,pip正是从这个文件了解到一个模块有哪些文件。

使用pkg_resources模块,你自己也可以后的这些信息

import pkg_resources
dist = pkg_resources.get_distribution('nox')
for path in dist.get_metadata_lines("RECORD"):
    print(path)

get_metadata_lines方法返回的文件目录远远多于卸载时所提示的目录,卸载提示时,只需要提示上层文件夹和个别文件即可,而RECORD记录的是该模块所有的文件,那么pip是如何做到的呢,查看源码,它最终使用一个函数来提取关键的上层目录和文件。

def compact(paths):
    # type: (Iterable[str]) -> Set[str]
    """Compact a path set to contain the minimal number of paths
    necessary to contain all paths in the set. If /a/path/ and
    /a/path/to/a/file.txt are both in the set, leave only the
    shorter path."""

    sep = os.path.sep
    short_paths = set()  # type: Set[str]
    for path in sorted(paths, key=len):
        should_skip = any(
            path.startswith(shortpath.rstrip("*")) and
            path[len(shortpath.rstrip("*").rstrip(sep))] == sep
            for shortpath in short_paths
        )
        if not should_skip:
            short_paths.add(path)
    return short_paths

算法非常的巧妙,首先根据目录长度从小到大排序,而后遍历排序后的目录,将上层目录放入到集合short_paths中,后续遍历到的目录如果以某个短目录开头,就说明是这个目录的某个文件,无需放入short_paths中,如此,最终得到的便是上层文件目录和个别的文件地址。

剩下的事情就简单了,执行删除操作就可以了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值