颜林林的个人网站

Python软件包管理的最佳实践

2023-12-21 00:02
题图
(题图由AI生成)
  1. 起因

相当长的一段时间里,愚蠢的我,在安装Python软件包(package)时,肆无忌惮地直接运行着 pip install XXX。看着它自动检查并寻找所依赖的其他软件包进行安装,进度条唰唰往前跑起来,最后一切ready,真爽!

今天,很偶然地,当我觉得不再需要某个包时,终于祭出了 pip uninstall 命令。本以为它能够依然智能地查出那些曾经搭便车被安装到系统中的包,并加以清理。然而,没想到,它只删除了我所指定的那个包,全然忘记了其他那些依赖项的存在。

经翻查文档和询问ChatGPT,才发现人家 pip 就是这么设计的,管装不管卸,只要一经安装到系统,就“一视同仁”对待,并不区分是否来自搭便车。这可真要命!原来从我第一次运行 pip install XXX 起,Python环境就已无法保持整洁了……

  1. 经过

所幸,会为这个问题烦恼的,并非我一个人,世界上同样矫情的人还是很多的。为此,有不止一个包,能够帮助解决这个问题(至少是部分解决吧)。这些包大同小异,原理也差不多,这里就选择其中一个,pip-autoremove,来加以介绍。

首先通过 pip install pip-autoremove 命令来安装它。

然后,运行 pip-autoremove -f 命令,它会列出所有的“孤儿依赖”(orphaned dependencies)包,即这些包并不被其他软件包所使用,它们的存在,要么是我们曾经手动安装过,要么就是搭便车来的。

于是,接下来就该人工浏览这个列表,根据我虽然愚蠢但仍然强大的大脑,回忆起哪些是用 pip 手工安装的,对它们逐一进行这样的清理:pip-autoremove XXX -y 。这个命令的强大之处在于,它清理 XXX 包时,会自动找到去掉 XXX 后新产生的“孤儿依赖”,以此认定它们是偷偷搭便车者,一并加以清除。

经过漫长的、反复多次、手工逐一清理,世界终于回归安宁。

  1. 结果

那么,从一开始,我们应该采取什么更好的实践方式呢?

当然是 venv 虚拟环境,ChatGPT 如是说。

使用 python -m venv FOO 命令,我们可以在当前目录下,创建一个名为 FOO 的子目录,该子目录中包含了一个虚拟环境,可以任由我们折腾。

再使用 . FOO/bin/activate 或 source FOO/bin/activate 命令,就可以将该虚拟环境激活,此时命令行提示符的最前面,会多出几个字符“(FOO) ”,提醒我们现在处于该虚拟环境中。

此后,我们就可以继续肆无忌惮使用 pip install XXX 了。什么时候觉得该环境不爽了,直接删掉该 FOO 整个目录即可。

这样的虚拟环境能同时创建很多个,可以将不同的软件版本依赖隔离开来,再不用纠结环境是不是被一大堆不知名的搭便车者所污染。

早该这么做了!

--- END ---

注:本文首发表于“不靠谱颜论”公众号,并同步至本站。

相关文章