python setup.py卸载


785

我已经使用安装了python软件包python setup.py install

如何卸载?


52
接受的答案已过时。使用pip uninstall <your_package>。请参阅stackoverflow.com/questions/1231688/…
约阿希姆W

21
pip卸载不再是有效的答案。这是证明。[sri @ localhost python] $ pip卸载foo弃用:不建议安装distutils安装的项目(foo),并且在以后的版本中将其删除。这是由于以下事实:卸​​载distutils项目只会部分卸载该项目。
shrewmouse15年

@shrewmouse不再显示。
罗卡蒙德

@JCRocamonde使用我创建的包,显示了最新版本的pip,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.所以这仍然是一个问题。
乔什

setup.py文件顶部的@Josh执行“来自setuptools导入设置”,而不是“来自distutils.core导入设置”。
bigjake

Answers:


976

注意:避免python setup.py install使用pip install .

您需要手动删除所有文件,还需要撤消安装过程中手动执行的任何其他操作。

如果您不知道所有文件的列表,则可以使用--record选件重新安装它,然后查看生成的列表。

要记录已安装文件的列表,可以使用:

python setup.py install --record files.txt

想要卸载后,可以使用xargs进行删除:

xargs rm -rf < files.txt

或者,如果您正在运行Windows,请使用Powershell:

Get-Content files.txt | ForEach-Object {Remove-Item $_ -Recurse -Force}

然后也删除包含的目录,例如/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/my_module-0.1.egg/on macOS。它没有文件,但是Python仍将导入一个空模块:

>>> import my_module
>>> my_module.__file__
None

删除后,Python将显示:

>>> import my_module
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'my_module'

6
如果这不起作用,请按以下方式添加sudo:cat files.txt | xargs sudo rm -rf
saroele 2014年

21
这会弄乱带空格的文件。请参阅下面的答案:stackoverflow.com/a/25209129/14456
伊恩·凯灵2014年

1
如何重新安装包含使用setup.py的源代码的软件包?
アレックス

5
这也将空目录保留在其位置。
Dilawar

3
嗨,我尝试了您的建议,当我尝试使用cat files.txt |中的某些文件时| xargs rm -rf表示即使在sudo模式下,权限也被拒绝,例如对于/ usr / local / bin / pydoc或/ usr / local / bin / idle,有什么想法吗?

212

对我来说,以下主要工作方式:

已安装点子,例如:

$ easy_install pip

从pip的角度检查已安装的软件包的名称:

$ pip freeze

这将列出您已经安装(并且被pip检测到)的所有软件包的名称。该名称可能会很长,然后仅使用和之后显示的程序包的名称#egg=。在大多数情况下,您也可以忽略版本部分(无论是后面的==还是-)。

然后卸载该软件包:

$ pip uninstall package.name.you.have.found

如果它要求您确认删除软件包,那么您很幸运,它将被删除。

pip应检测所有由pip安装的软件包。它还应检测通过easy_install或setup.py安装的大多数软件包,但这在极少数情况下可能会失败。

这是来自本地测试的真实示例,带有ttr.rdstmc在Windows上命名的软件包。

$ pip freeze |grep ttr
ttr.aws.s3==0.1.1dev
ttr.aws.utils.s3==0.3.0
ttr.utcutils==0.1.1dev

$ python setup.py develop
.....
.....
Finished processing dependencies for ttr.rdstmc==0.0.1dev

$ pip freeze |grep ttr
ttr.aws.s3==0.1.1dev
ttr.aws.utils.s3==0.3.0
-e hg+https://vlcinsky@bitbucket.org/vlcinsky/ttr.rdstmc@d61a9922920c508862602f7f39e496f7b99315f0#egg=ttr.rdstmc-dev
ttr.utcutils==0.1.1dev

$ pip uninstall ttr.rdstmc
Uninstalling ttr.rdstmc:
  c:\python27\lib\site-packages\ttr.rdstmc.egg-link
Proceed (y/n)? y
  Successfully uninstalled ttr.rdstmc

$ pip freeze |grep ttr
ttr.aws.s3==0.1.1dev
ttr.aws.utils.s3==0.3.0
ttr.utcutils==0.1.1dev

编辑2015-05-20

上面写的所有内容仍然适用,无论如何,现在有一些小的修改。

在python 2.7.9和python 3.4中安装pip

最新的python版本附带了一个软件包ensurepip,即使离线也可以安装pip:

$ python -m surepip-升级

在某些系统(例如Debian Jessie)上,此功能不可用(以防止破坏系统python安装)。

使用grepfind

上面的示例假定您已grep安装。我(当时我的计算机上装有MS Windows)安装了一套Linux实用程序(包括grep)。或者,使用本机MS Windows find或简单地忽略该过滤,并在更长的检测到的python软件包列表中找到名称。


1
您使用哪种包装工具/版本来工作?(distutilsdistribute,等...)
西罗桑蒂利冠状病毒审查六四事件法轮功

1
我用setuptools。您可以检查bitbucket.org/vlcinsky/ttr.aws.utils.s3(这并不完美)。无论如何,我对命名空间包的使用感到非常不满意,有时导入被破坏而没有明显的原因。但这是另一个故事。
Jan Vlcinsky

1
纠正自己。即使我导入setuptools,实际上我也使用distribute。另一课:从pypi安装我自己的软件包并计划在本地开发另一个共享相同名称空间的软件包时,请不要使用 $ pip install <the package>,use $ easy_install <the package>,否则在导入开发软件包时会遇到冲突。
2013年

1
为了帮助他人:因为我不是root用户,所以我将所有东西都安装在了家里。这就是我所做的easy_install --user --prefix=$HOME pip。然后我说我的路径中的以下内容:ln -s /home/tflutre/.local/bin/pip ~/binln -s /home/tflutre/.local/bin/pip2.7 ~/binln -s /home/tflutre/.local/bin/pip2 ~/bin
tflutre

3
这应该是可以接受的答案,因为它容易得多,而pip通常随Python一起提供。在命令提示符/终端中使用很简单- pip uninstall modulepython -m pip uninstall module应该可以工作。也应该是跨平台的,就像Python的一部分一样。
爱德华

81

第一个答案有问题:

  • 在Mac上无法使用。
  • 如果安装的文件包含空格或其他特殊字符,该xargs命令将失败,并删除与各个单词匹配的所有文件/目录。
  • -rrm -rf是不必要的,在最坏的情况可能会删除你不想要的东西。

相反,对于类Unix:

sudo python setup.py install --record files.txt
# inspect files.txt to make sure it looks ok. Then:
tr '\n' '\0' < files.txt | xargs -0 sudo rm -f --

对于Windows:

python setup.py bdist_wininst
dist/foo-1.0.win32.exe

卸载setup.py安装还有一些无法解决的问题,在典型情况下不会打扰您。有关更完整的答案,请参见以下Wiki页面:

https://ofswiki.org/wiki/Uninstalling_setup.py_install


3
您为什么不只在建议中留下建议呢?请注意,这些“严重问题”是关于极端情况的。
lpapp 2014年

17
我在被推荐的评论下发表了评论。我的评论埋在很少有人点击的“加载更多评论”链接下。我也做了自己的回答,因为我还有很多话要说。我的答案中的链接。另外,当文件中有空格时,首字母大写并不是我想到的第一个术语。
伊恩·凯灵

对于它的价值,我认为这将对包含换行符的文件名失败:)是否有任何软件包维护者是邪恶的,我希望我永远不会发现。
Jack O'Connor 2014年

2
至少在OS X Mavericks上,xargs没有-d选项。为什么?因为苹果爱你。无论如何,这具有与上述相同的效果,并且对于空间等是安全的。不过,它是针对Bash的。使用--record至files.txt运行安装后:OIFS=$IFS; IFS=$'\n'; FILES=( $( cat files.txt ) ); IFS=$OIFS; sudo rm -rf "${FILES[@]}"
Joseph Sikorski

2
@IanKelling printf如果字符串恰好包含%\字符,则将其嵌入格式字符串中将失败。始终提供格式字符串:( printf '%s\0' "$line"也避免回显)。尽管您可以通过仅使用tr '\n' '\0' < files.txt | xargs -0 rm -f
geirha

39

首先记录您已安装的文件。即使您先前已经运行过,也可以重复此命令setup.py install

python setup.py install --record files.txt

要卸载时,您可以:

sudo rm $(cat files.txt)

之所以可行,是因为rm命令使用空格分隔的文件列表来删除,并且您的安装记录就是这样的列表。


有没有一种方法不仅可以检查是否是我的程序安装了该程序,而且还可以检查自那时以来是否没有其他应用程序使用此资源?例如,我安装了一个工具,为此,我必须安装几个库,也许其中一些库已经安装(这意味着我无法在卸载过程中删除),但是我也无法删除其他应用程序未安装,因为我的图书馆已首先安装
。– Gabrielle

19

现在,python让您可以选择在安装pip过程中进行安装(我在Windows上,至少python在Windows上可以!)。考虑到您已选择pip在安装python时进行安装(实际上是默认设置,因此不必选择),pip已经为您安装了。然后,pip在命令提示符下键入,您应该会看到一个帮助。您可以在此处找到必要的使用说明。例如,pip list显示已安装软件包的列表。您可以使用

pip uninstall package_name

卸载不再需要的任何软件包。在此处阅读更多信息(pip文档)


8

懒惰的方式:只需从Windows安装菜单(如果使用Windows)或从rpm命令卸载,前提是您在创建分发程序包后首先重新安装它。

例如,

python setup.py bdist_wininst
dist/foo-1.0.win32.exe

(“ foo”当然是示例)。


4
我不知道我是否喜欢它,但是您对直觉思维有所了解。:)
Lennart Regebro 09年

老实说,我不确定是不是“懒惰的方式” ;-)但是我想我想提到有可能创建更多的“标准”安装程序。奇怪的是setup.py没有提供一种清除软件包的干净方法。
RedGlyph

1
卸载需要对已安装的软件包及其文件进行集中注册,而没有一个。有关如何改善此故事的讨论正在进行中,可能会在Python 2.7 / 3.2或2.8 / 3.3左右解决。
Lennart Regebro,2009年

1
@Lennart:至少不会有Python 2.8是当前的官方声明
Piotr Owsiak

2
@PiotrOwsiak:是的,但是那不是声明。我认为那时候2.8仍然是可能的,并且一直保持到去年年底PEP 404批准为止。
Lennart Regebro 2012年

6

转到python软件包目录并删除.egg文件,例如:在python 2.5(ubuntu)中:/usr/lib/python2.5/site-packages/

在python 2.6(ubuntu)中:/usr/local/lib/python2.6/dist-packages/


1
可行,除非将安装文件安装在软件包外部(某些人可以这样做),例如installsetstools和easy_install命令。
Lennart Regebro,2009年

3
通常,如果使用OP指定的python setup.py安装软件包,则不会产生任何麻烦。OTOH,如果有一个原因是因为使用过easy_install,则记录的卸载软件包的方法是在删除egg文件之前使用easy_install -m。否则,蛋壳可能会留在easy-install.pth文件中。
内德·迪利2009年

5

不能完全回答问题,但每天都能对我有所帮助:

安装您的软件包

pip install .

这会将包装放入$HOME/.local。卸载

pip uninstall <package_name>

1
pip unistall .没为我工作,但pip uninstall <package_name>做了,谢谢!
Danijel

4

可能您可以这样做:

1)获取python版本-

[linux machine]# python
Python 2.4.3 (#1, Jun 18 2012, 14:38:55) 

->上面的命令为您提供了当前的python版本2.4.3

2)获取python的安装目录-

[linux machine]# whereis python
python: /usr/bin/python /usr/bin/python2.4 /usr/lib/python2.4 /usr/local/bin/python2.5 /usr/include/python2.4 /usr/share/man/man1/python.1.gz

->从上面的命令中,您可以获得安装目录-/ usr/lib/python2.4/site - packages

3)从这里您可以删除软件包和python egg文件

[linux machine]# cd /usr/lib/python2.4/site-packages
[linux machine]# rm -rf paramiko-1.12.0-py2.4.egg paramiko-1.7.7.1-py2.4.egg paramiko-1.9.0-py2.4.egg

这对我有用。而且我能够卸载困扰我的软件包:)


3

我认为您可以打开setup.py,找到软件包名称,然后要求pip卸载它。

假设名称在“ METADATA”变量中可用:

pip uninstall $(python -c "from setup import METADATA; print METADATA['name']")

1

扩展一下Martin所说的内容,记录安装输出和一些bash脚本就可以很好地解决问题。这是我的工作

for i in $(less install.record);
sudo rm $i;
done;

和presto。已卸载。


2
将它写成要容易得多sudo xargs rm -v < install.record
poolie

1

如果在重新安装软件包后仍有一些文件应删除,请确保该文件夹build也已删除。因此,假设这pkg是您要删除的软件包:

rm -r $(python3 -c "import pkg; print(pkg.__path__[0] + '*' )") 
rm -rf build

以上为python3计算并删除了软件包及其* .egg-info文件


1

{virtualenv}/lib/python2.7/site-packages/(如果未使用virtualenv,则为{system_dir}/lib/python2.7/dist-packages/

  • 删除鸡蛋文件(例如distribute-0.6.34-py2.7.egg
  • 如果文件中有任何内容easy-install.pth,请删除相应的行(它应该是源目录或egg文件的路径)。

0

我过去曾经在全局环境中偶然运行过“ python setup.py install”,并且卸载时遇到很多困难。这些解决方案没有帮助。“ pip卸载”不适用于“无法卸载'splunk-appinspect'。找不到要卸载的文件。” “ sudo pip卸载”不起作用“无法卸载要求splunk-appinspect,未安装”。我尝试卸载pip,删除pip缓存,在硬盘上搜索该软件包等,...

“ pip show”最终将我引向解决方案,“ Location:”指向目录,并且重命名该目录导致打包的内容从pip列表中删除。我重命名了目录,但它没有重新出现在pip的列表中,现在我可以在virtualenv中重新安装我的软件包了。


0

python setup.py install在PyCharm中运行了一次,它将所有软件包安装到conda基本环境中。以后,当我要删除所有这些程序包时,将pip uninstall无法正常工作。我不得不从/anaconda3/lib/python3.7/site-packages中手动删除它们:(

因此,我看不出他们为什么使用setup.py而不是编写requirements.txt文件的原因。需求文件可用于在虚拟环境中安装软件包,并且不会与系统python软件包混淆。


-1

最好使用bash读取命令来删除相关文件,如下所示:

sudo python setup.py install --record files.txt
sudo bash -c "cat files.txt | xargs rm -rf"

这是一个现有的较早答案的副本。
Karl Richter)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.