绕过 pip 卸载的确认提示
Posted
技术标签:
【中文标题】绕过 pip 卸载的确认提示【英文标题】:Bypass confirmation prompt for pip uninstall 【发布时间】:2011-07-08 12:48:43 【问题描述】:我正在尝试卸载我的超级用户环境中的所有 django 包,以确保我的所有 webapp 依赖项都安装到我的 virtualenv。
sudo su
sudo pip freeze | grep -E '^django-' | xargs pip -q uninstall
但是 pip 想要确认每个包卸载,并且 pip 似乎没有-y
选项。有没有更好的方法来卸载一批 python 模块? rm -rf .../site-packages/
是正确的方法吗?有没有 easy_install 替代方案?
或者,强制 pip 将所有依赖项安装到 virtualenv 而不是依赖系统 python 模块来满足这些依赖项会更好,例如pip --upgrade install
,但强制安装 同样旧的 版本以覆盖任何系统模块。我尝试激活我的 virtualenv 然后pip install --upgrade -r requirements.txt
并且似乎安装了依赖项,甚至那些存在于我的系统路径中的依赖项,但我不能确定这是否是因为我的系统模块是旧的。而man pip
似乎并不能保证这种行为(即安装系统站点包中已经存在的相同版本的包)。
【问题讨论】:
【参考方案1】:在www.saturncloud.io,Jupiter 笔记本可以这样使用:
!yes | pip uninstall tensorflow
!yes | pip uninstall gast
!yes | pip uninstall tensorflow-probability
【讨论】:
【参考方案2】:从 pip 版本 7.1.2 开始,您可以运行 pip uninstall -y <python package(s)>
pip uninstall -y package1 package2 package3
或来自文件
pip uninstall -y -r requirements.txt
【讨论】:
【参考方案3】:如果你想从requirements.txt
卸载每个包,
pip uninstall -y -r requirements.txt
【讨论】:
【参考方案4】:pip install -U xxxx
可以绕过确认
【讨论】:
请尽量写完整有意义的句子并编辑代码部分。【参考方案5】:Pip 不包含 --yes 选项(自 pip 版本 1.3.1 起)。
解决方法:管道是的!
$ sudo ls # enter pw so not prompted again
$ /usr/bin/yes | sudo pip uninstall pymongo
【讨论】:
啊,多么简单。感谢 Unix 程序提醒。yes
太有用了。
但我不认为这会起作用(今天在我的系统上尝试它太胆小了)。 yes | sudo pip freeze | grep -E '^django-' | xargs pip -q uninstall
因为yes
es 会被pip freeze
而不是xargs
参数/命令、pip uninstall
吞噬。
pip freeze > all_to_uninstall.txt
yes | pip uninstall -r all_to_uninstall.txt
(对于上面的滚刀问题,bash - How can I pipe yes to a program started by xargs? - Stack Overflow)【参考方案6】:
Lakshman Prasad 是对的,pip --upgrade
和/或virtualenv --no-site-packages
是正确的选择。卸载系统范围的 python 模块很糟糕。
pip 的--upgrade
选项确实会在虚拟环境中安装所需模块,即使它们已经存在于系统环境中,即使所需版本或最新可用版本与系统版本相同。
pip --upgrade install
并且,在创建虚拟环境时使用 --no-site-packages 选项可确保缺少的依赖项不可能被系统路径中缺少的模块所掩盖。这有助于在将模块从一个包迁移到另一个包期间暴露问题,例如pinax.apps.groups -> django-groups,尤其是当问题在于 django 中的 load templatetags 语句时,它会在所有可用模块中搜索 templatetags 目录和其中的标签定义。
【讨论】:
【参考方案7】:或者,强制 pip 将所有依赖项安装到 virtualenv 而不是依赖系统 python 模块来满足这些依赖项会更好吗,
是的。不要过多使用内置系统安装的软件包。许多系统包,特别是在 OS X 中(甚至是 debian 和衍生版本)都过于依赖它们。
pip --upgrade install,但强制安装同样旧的版本以覆盖任何系统模块。
如果在 venv 中安装了一些系统包中已经存在的包,这应该没什么大不了的,特别是如果它们的版本不同。这就是 virtualenv 的全部意义所在。
我尝试激活我的 virtualenv,然后 pip install --upgrade -r requirements.txt 这似乎安装了依赖项,甚至那些存在于我的系统路径中的依赖项,但我不能确定这是否是因为我的系统模块老了。而且 man pip 似乎不能保证这种行为(即安装系统站点包中已经存在的相同版本的包)。
不,它不会安装主安装中已经存在的软件包,除非您使用 --no-site-packages
标志创建它,或者所需版本和当前版本不同..
【讨论】:
以上是关于绕过 pip 卸载的确认提示的主要内容,如果未能解决你的问题,请参考以下文章
我可以绕过 Visual Studio 安装项目中的卸载吗?
如果用户先前已授权访问,如何绕过 Spring security OAuth2 中的访问确认步骤?