在我的 Ubuntu 系统上,很久以前我通过 pip 在 /usr/local/lib 中手动安装了许多 python 库,其中一些库现在已经被 /usr/lib 中官方 ubuntu 软件包中的库所取代。这可能是问题的根源,因为 /usr/local/lib 中的库在默认 python 环境中具有优先权。
您认为从 /usr/local/lib 树中识别 /usr/lib 中存在较新版本的库和现在不再需要的库的最佳方法是什么?
我正在考虑监控 /usr/local/lib/python* 树中访问其库的 python 脚本,并手动检查 /usr/lib/python* 中相应的库是否有效,但这是最好的策略吗?
答案1
不幸的是,目前没有办法用现有的命令行工具来检查这一点,因为列出的软件包pip
非常有限(我想一旦#4575已实现)。但是,使用一些脚本,您可以自己执行包过滤和版本比较。这里有一个建议:
#!/usr/bin/env python3
from distutils.version import LooseVersion
from pkg_resources import find_distributions
sys_pkgs = find_distributions('/usr/lib/python3/dist-packages')
local_pkgs = find_distributions('/usr/local/lib/python3.6/dist-packages')
for pkg in local_pkgs:
sys_pkg = next((p for p in sys_pkgs if p.project_name == pkg.project_name), None)
if sys_pkg is not None and LooseVersion(sys_pkg.version) >= LooseVersion(pkg.version):
print(pkg)
首先,脚本会扫描/usr/lib/python3/dist-packages
已/usr/local/lib/python3.6/dist-packages
安装的软件包(根据需要调整 Python 版本/目标路径)。之后,针对每个“本地”软件包检查:
- 安装了同名的“系统”包,并且
- 比“本地”版本更新
如果满足这两个条件,则“本地”包将被视为过时的包,并将被打印出来。一旦您有了列表,通过常规方式卸载其条目pip3 uninstall <pkgname>
应该是一项简单的任务。