我正在尝试修复我的virtualenv之一-我想将所有已安装的库重置为与生产相匹配的库。
有没有一种快速简便的方法来使用pip?
我正在尝试修复我的virtualenv之一-我想将所有已安装的库重置为与生产相匹配的库。
有没有一种快速简便的方法来使用pip?
Answers:
我已找到此代码段作为替代解决方案。与重建virtualenv相比,这是对库的更优雅的删除:
pip freeze | xargs pip uninstall -y
如果您通过VCS安装了软件包,则需要排除这些行并手动删除软件包(从下面的注释中升高):
pip freeze | grep -v "^-e" | xargs pip uninstall -y
postactivate
将要保留的内容进行了更改。
setuptools
程序包。我解决了以下说明这里的问题:stackoverflow.com/questions/7446187/...
pip freeze --exclude-editable | xargs pip uninstall -y
不使用grep模式而忽略VCS软件包
这将适用于所有Mac,Windows和Linux系统。要在requirements.txt文件中获取所有pip包的列表(注意:如果存在,它将覆盖requirements.txt,否则将创建新的pip包,如果您不想替换旧的requirements.txt,请提供其他文件名在所有以下命令中将它们放置在requirements.txt中)。
pip freeze > requirements.txt
现在一一删除
pip uninstall -r requirements.txt
如果我们想一次删除所有
pip uninstall -r requirements.txt -y
如果您正在处理具有requirements.txt
文件的现有项目,并且您的环境有所不同,只需requirements.txt
将上面的示例替换为toberemoved.txt
。然后,完成上述步骤后,您可以使用requirements.txt
来更新您现在干净的环境。
对于不创建任何文件的单个命令(如@joeb建议)。
pip uninstall -y -r <(pip freeze)
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
一次性完成所有操作。
这适用于最新版本。我认为这是最短,最声明的方式。
virtualenv --clear MYENV
但是通常由于不变性规则,我只是删除并重新创建virtualenv!
wipeenv
吗?virtualenvwrapper.readthedocs.org/en/latest/...
wipeenv
在环境中,如果在pip install -e
开发版本的上下文中使用,则抛出错误并且不会删除任何内容,而尝试使用virtualenv --clear MYENV
不会抛出错误并且不会删除任何错误您以前在环境中安装的软件包。至少在OSX上是这种情况。有关更多信息,请参见bitbucket.org/dhellmann/virtualenvwrapper/issues/211/…。
wipeenv
是virtualenvwrapper提供的别名,因此并非所有人都拥有。
我想在评论部分中提出这个答案,因为它是线程中最优雅的解决方案之一。此答案的全部功劳归@joeb。
pip uninstall -y -r <(pip freeze)
对于清除在virtualenv上下文之外的我的用户包文件夹的用例来说,这对我来说非常有用,上面的许多答案都无法解决。
编辑:有人知道如何使此命令在Makefile中工作吗?
为了方便起见,我将其添加到我的bash个人资料中:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
然后运行:
pipuninstallall
如果碰巧正在使用pipenv,则可以运行:
pipenv uninstall --all
pip freeze
,如果未安装任何软件包,则不会输出任何内容,然后会pip uninstall
抱怨)。
<(...)
是bashism。因此,您可以使用bash -c“ ...”,也可以通过执行pip freeze | pip uninstall -r /dev/stdin
ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
使用pip list
或pip freeze
必须包含--local
其他内容的其他答案也将卸载在通用名称空间中找到的软件包。
这是我经常使用的代码段
pip freeze --local | xargs pip uninstall -y
参考: pip freeze --help
ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
。然后,我无法再卸载任何模块。
pip freeze
)pip freeze | xargs pip uninstall -y
pip list
)pip list | awk '{print $1}' | xargs pip uninstall -y
virtualenv
)virtualenv --clear MYENV
pip list
)效果很好,直到您pip意外地将自身卸载-_-
最快的方法是完全重新制作virtualenv。我假设您有一个与生产匹配的requirements.txt文件,如果不匹配:
# On production:
pip freeze > reqs.txt
# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt
我通过执行以下操作来管理它:
使用当前安装的软件包列表创建名为reqs.txt的需求文件
pip freeze > reqs.txt
然后从reqs.txt卸载所有软件包
pip uninstall \
-y # remove the package with prompting for confirmation
-r reqs.txt
我喜欢这种方法,因为您总是有一个pip要求文件,以防您出错。这也是可重复的。
在Windows上,如果path
配置正确,则可以使用:
pip freeze > unins && pip uninstall -y -r unins && del unins
对于类似Unix的系统,情况应该类似:
pip freeze > unins && pip uninstall -y -r unins && rm unins
只是警告说这并不完全可靠,因为您可能会遇到诸如“找不到文件”之类的问题,但在某些情况下仍然可以使用
编辑:为清楚起见:unins
是一个任意文件,当执行此命令时,其数据已写入其中:pip freeze > unins
依次写入的文件将用于通过暗示的同意/事先批准的方式卸载上述软件包。 pip uninstall -y -r unins
该文件最终在完成后被删除。
wipeenv
我知道这是一个古老的问题,但是我确实偶然发现了,因此为了将来参考,您现在可以这样做:
pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...
-r,-要求文件
卸载给定需求文件中列出的所有软件包。此选项可以多次使用。
从pip文档版本8.1
(将此添加为答案,因为我没有足够的声誉来评论@blueberryfields的答案)
@blueberryfields的答案很好用,但如果没有要卸载的软件包则失败(如果此“全部卸载”是脚本或makefile的一部分,则可能是一个问题)。这可以通过xargs -r
使用GNU版本的来解决xargs
:
pip freeze --exclude-editable | xargs -r pip uninstall -y
来自man xargs
:
-r,--no-run-if-empty
如果标准输入不包含任何非空格,请不要运行该命令。通常,即使没有输入,命令也会运行一次。此选项是GNU扩展。
仅使用即可提供跨平台支持pip
:
#!/usr/bin/env python
from sys import stderr
from pip.commands.uninstall import UninstallCommand
from pip import get_installed_distributions
pip_uninstall = UninstallCommand()
options, args = pip_uninstall.parse_args([
package.project_name
for package in
get_installed_distributions()
if not package.location.endswith('dist-packages')
])
options.yes = True # Don't confirm before uninstall
# set `options.require_venv` to True for virtualenv restriction
try:
print pip_uninstall.run(options, args)
except OSError as e:
if e.errno != 13:
raise e
print >> stderr, "You lack permissions to uninstall this package.
Perhaps run with sudo? Exiting."
exit(13)
# Plenty of other exceptions can be thrown, e.g.: `InstallationError`
# handle them if you want to.
跨平台和在pipenv中工作的简单而健壮的方法是:
pip freeze
pip uninstall -r requirement
通过pipenv:
pipenv run pip freeze
pipenv run pip uninstall -r requirement
但不会更新piplock或pipfile,因此请注意
就我而言,我意外地使用pip
在macOS上安装的Homebrew 在全球范围内安装了许多软件包。恢复默认软件包的最简单方法是:
$ brew reinstall python
或者,如果您使用的是pip3
:
$ brew reinstall python3
在Windows的Command Shell中,该命令
pip freeze | xargs pip uninstall -y
将不起作用。因此,对于那些使用Windows的人,我已经找到了一种替代方法。
pip freeze
命令复制到.txt文件。pip uninstall -r *textfile.txt*
如果使用pew
,则可以使用擦拭命令:
pew wipeenv [env]
我使用--user选项来卸载用户站点中安装的所有软件包。
pip3冻结--user | xargs pip3卸载-y
Pip无法知道它安装了哪些软件包以及系统的软件包管理器安装了哪些软件包。为此,您需要执行以下操作
对于基于rpm的发行版(将python2.7替换为安装了pip的python版本):
find /usr/lib/python2.7/ |while read f; do
if ! rpm -qf "$f" &> /dev/null; then
echo "$f"
fi
done |xargs rm -fr
对于基于Deb的发行版:
find /usr/lib/python2.7/ |while read f; do
if ! dpkg-query -S "$f" &> /dev/null; then
echo "$f"
fi
done |xargs rm -fr
然后清理剩下的空目录:
find /usr/lib/python2.7 -type d -empty |xargs rm -fr
我发现最重要的答案很容易引起误解,因为它会删除您发行版中的所有(大多数?)python软件包,并可能使您的系统崩溃。
dpkg-query -S '/usr/lib/python2.7/*'
提取dpkg-query -L
每个名称来转储关联文件呢?它已经准备好了清单。我的主要反对意见是,您不是将安装包定位为通过pip安装在任何地方,而是将安装包定位为不是您期望的管理者以外的其他任何位置,并且安装位置通常不应碰到pip。pip list -l
列出了它在本地安装的软件包,有些甚至会列出pip install --target=...
。删除所有当前空的目录也将对您造成伤害!