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.apt
apt
/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
特定路径安装的包,所以不要使用这些命令。