重新安装/升级所有 python 用户站点的软件包,而不是 Ubuntu 全局软件包

重新安装/升级所有 python 用户站点的软件包,而不是 Ubuntu 全局软件包

pip当我第一次安装 Ubuntu(16.04 LTS)时,我没有意识到(一般来说)通过使用以下命令安装 python 包不是一个好主意sudo

sudo pip install mypackage

但是,每当我想要安装一个未经许可的包时,sudo就会被拒绝。

现在,我意识到我应该使用标志安装大多数/所有这些软件包--user

pip install --user mypackage

这将阻止任何软件包以 root 权限在我的计算机上执行不需要的代码。(我现在还使用 virtualenv 和类似程序设置了更好的环境)。

但是,我仍然安装了许多软件包pip,我想以用户身份而不是 root 身份重新安装它们。但是,据我所知,Ubuntu 默认安装了一些 python 软件包(通过apt-get,但这些软件包仍然列出,可以通过 删除pip)。所以我的问题是:如何删除(并重新安装)我已安装的所有软件包,而不会弄乱 Ubuntu 使用的软件包?

答案1

正确的方法

创建所有 Python 包的列表:

pip list --format=legacy | awk '{print $1}' | sed 's/.*/\L&/' | sort  > /tmp/list.pip

然后创建由以下人员安装的所有这些软件包的列表apt

cat /tmp/list.pip | sed 's/.*/\L&/' | 
xargs -Ipkg dpkg -l python-pkg python3-pkg pkg |& grep ^ii |
 awk '{print $2}' | sed -r s/^python3?-// | sort | uniq > /tmp/list.apt

现在我们得到了可以删除的 python 包列表,以及/tmp/list.pip由安装的包,手动检查它们并删除不在 中的包。pip/tmp/list.aptapt/tmp/apt.list


由于 apt 和 pip 之间的命名约定不同,下面的解决方案无法正常工作。我稍后会修复它...

pip最后得到所有仅由和 未安装的软件包的列表apt(软件包存在于文件中/tmp/list.pip但不存在于/tmp/list.apt):

comm /tmp/list.apt /tmp/list.pip -3 > /tmp/list_toRemove

然后使用/tmp/list_toRemove内容来删除或升级您的pip包。

例如,要删除所有文件,您可以运行:

pip uninstall $(cat /tmp/list_toRemove)

并重新安装它们:

pip install $(cat /tmp/list_toRemove) --user

错误的方法

使用如下命令:

pip list --user
pip list --local
pip freeze --user
pip freeze --local

还包括从apt特定路径安装的包,所以不要使用这些命令。

相关内容