【问题标题】:python setup.py uninstallpython setup.py 卸载
【发布时间】:2010-12-05 17:36:00
【问题描述】:

我已经安装了一个带有python setup.py install的python包。

如何卸载它?

【问题讨论】:

  • 接受的答案已过时。使用pip uninstall <your_package>。见stackoverflow.com/questions/1231688/…
  • pip 卸载不再是一个有效的答案。这是证据。 [sri@localhost python]$ pip uninstall foo 弃用:卸载 distutils 安装的项目 (foo) 已被弃用,将在未来版本中删除。这是因为卸载 distutils 项目只会部分卸载该项目。
  • @shrewmouse 不再显示。
  • @J.C.Rocamonde 使用我创建的包,最新版本的 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. 所以这仍然是一个问题。
  • @Josh 在 setup.py 文件的顶部执行“从 setuptools 导入设置”而不是“从 distutils.core 导入设置”。

标签: python setup.py pypi


【解决方案1】:

注意:避免使用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/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'

【讨论】:

  • 如果这样不行,添加sudo如下:cat files.txt | xargs sudo rm -rf
  • 这会弄乱带有空格的文件。请参阅下面的答案:stackoverflow.com/a/25209129/14456
  • 我如何重新安装包我有使用 setup.py 的源代码?
  • 这也会留下空目录。
  • 嗨,我尝试了你的建议,当我尝试 cat files.txt | xargs rm -rf 它说权限被拒绝,即使在 sudo 模式下,例如对于 /usr/local/bin/pydoc 或 /usr/local/bin/idle 有什么想法吗?
【解决方案2】:

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

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

【讨论】:

  • 有效,除非 install 安装了软件包之外的文件,有些人会这样做,例如安装的 setuptools 和 easy_install 命令。
  • 通常情况下,如果使用 OP 指定的 python setup.py 安装包,则不会有鸡蛋。 OTOH,如果有一个因为使用了easy_install,那么卸载软件包的记录方法是在删除egg文件之前使用easy_install -m;否则,easy-install.pth 文件中可能会留下蛋壳。
【解决方案3】:

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

例如,

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

(“foo”当然是一个例子)。

【讨论】:

  • 我不知道我是否喜欢它,但你得到了正交思维的要点。 :)
  • 说实话,我也不确定因此是“懒惰的方式”;-) 但我想我会提到可以创建更多的“标准”安装程序。奇怪的是 setup.py 没有提供一个干净的方法来删除包。
  • 卸载需要已安装软件包及其文件的集中注册表,但没有。关于如何改进这个故事的讨论正在进行中,它可能会在 Python 2.7/3.2 或 2.8/3.3 左右得到解决。
  • @Lennart:不会有 Python 2.8 至少这是目前的官方声明
  • @PiotrOwsiak:是的,但那不是当时的声明。 2.8 在当时仍然是一种可能性,并且一直如此,直到去年年底 PEP 404 获得批准。
【解决方案4】:

扩展 Martin 所说的内容,记录安装输出并编写一些 bash 脚本非常有效。这就是我的工作......

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

然后很快。已卸载。

【讨论】:

  • 更容易写成sudo xargs rm -v &lt; install.record
【解决方案5】:

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

python setup.py install --record files.txt

当你想卸载时,你可以:

sudo rm $(cat files.txt)

这是可行的,因为 rm 命令需要一个以空格分隔的文件列表来删除,而您的安装记录就是这样一个列表。

【讨论】:

  • 有没有办法不仅可以检查是否是我的程序安装了它,还可以检查从那时起是否没有其他应用程序使用此资源?例如,我安装了一个工具,为此,我必须安装几个库,可能其中一些已经安装(这意味着我无法在卸载过程中删除)但我也无法删除其他应用程序的任何内容没有安装,因为我的库是先安装的..
【解决方案6】:

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

已安装 pip,例如:

$ easy_install pip

检查,从 pip 的角度来看,您安装的包是如何命名的:

$ pip freeze

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

然后卸载包:

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

如果它要求确认删除包裹,那么你很幸运,它会被删除。

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

这是我在 MS Windows 上使用名为 ttr.rdstmc 的包进行本地测试的真实示例。

$ 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 ensurepip --upgrade

在某些系统(如 Debian Jessie)上,这是不可用的(以防止破坏系统 python 安装)。

使用grepfind

以上示例假设您安装了grep。我(当时我的机器上有 MS Windows)安装了一组 linux 实用程序(包括 grep)。或者,使用原生 MS Windows find 或直接忽略该过滤并在检测到的 Python 包的更长列表中查找名称。

【讨论】:

  • 您使用哪个打包工具/版本来实现这一点? (distutilsdistribute 等...)
  • 我使用setuptools。您可以查看bitbucket.org/vlcinsky/ttr.aws.utils.s3(这并不完美)。无论如何,我对使用命名空间包非常不满意,有时导入会在没有明显原因的情况下被破坏。但这是另一个故事。
  • 纠正自己。即使我导入setuptools,实际上我使用distribute。另一个教训:当我从 pypi 安装我自己的包并计划在本地开发另一个共享相同命名空间的包时,不要使用$ pip install &lt;the package&gt;,使用$ easy_install &lt;the package&gt;,否则在导入开发时会遇到冲突包。
  • 帮助别人:因为我不是root,所以我在家里安装了所有东西。这是我所做的easy_install --user --prefix=$HOME pip。然后我在我的 PATH 中添加了以下内容:ln -s /home/tflutre/.local/bin/pip ~/binln -s /home/tflutre/.local/bin/pip2.7 ~/binln -s /home/tflutre/.local/bin/pip2 ~/bin
  • 这应该被接受,因为它更容易,并且 pip 通常随 Python 一起提供。在命令提示符/终端中使用很简单 - pip uninstall modulepython -m pip uninstall module 应该可以工作。也应该是跨平台的,就像 Python 的一部分一样。
【解决方案7】:

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

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

【讨论】:

  • 这是现有早期答案的副本。
【解决方案8】:

也许你可以这样做:-

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

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

【讨论】:

    【解决方案9】:

    #1 的答案有问题:

    • 无法在 mac 上运行。
    • 如果安装的文件包含空格或其他特殊 字符,xargs 命令将失败,并删除任何 匹配单个单词的文件/目录。
    • rm -rf 中的 -r 是不必要的,最坏的情况可能会删除你的内容 不想。

    相反,对于类 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 --
    

    对于窗户:

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

    卸载setup.py install 也存在无法解决的问题,在典型情况下不会打扰您。如需更完整的答案,请参阅此 wiki 页面:

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

    【讨论】:

    • 您为什么不在点赞的下方留下建议?请注意,这些“严重问题”是关于极端情况的。
    • 我在点赞的下方留言。我的评论隐藏在“加载更多 cmets”链接下,很少有人点击。我也做出了自己的回答,因为我还有很多话要说,即。我的答案中的链接。此外,当文件中有空格时,极端情况不会是我想到的第一个术语。
    • 对于它的价值,我认为这将在包含换行符的文件名上失败 :) 是否有任何包维护者如此邪恶,我希望我永远不会发现。
    • 至少在 OS X Mavericks 上,xargs 没有 -d 选项。为什么?因为苹果爱你。无论如何,这具有与上述相同的效果,并且对于空格等是安全的。不过,它是特定于 Bash 的。使用 --record to files.txt 运行安装后:OIFS=$IFS; IFS=$'\n'; FILES=( $( cat files.txt ) ); IFS=$OIFS; sudo rm -rf "${FILES[@]}"
    • @IanKelling 在printf 的格式字符串中嵌入变量如果字符串碰巧包含例如%\ 字符。始终提供格式字符串:printf '%s\0' "$line"(也避免回显)。尽管您可以通过使用tr '\n' '\0' &lt; files.txt | xargs -0 rm -f 进一步避免循环
    【解决方案10】:

    现在,python 让您可以选择在安装过程中安装pip(我在 Windows 上,至少 python 在 Windows 上这样做!)。考虑到您在安装 python 期间选择了安装pip(您实际上不必选择,因为它是默认设置),pip 已经为您安装好了。然后,在命令提示符下输入pip,您应该会看到帮助。您可以在那里找到必要的使用说明。例如。 pip list 显示已安装软件包的列表。你可以使用

    pip uninstall package_name
    

    卸载您不再需要的任何软件包。阅读更多here (pip documentation)

    【讨论】:

      【解决方案11】:

      我觉得你可以打开setup.py,找到包名,然后让pip卸载它。

      假设名称在“元数据”变量中可用:

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

      【讨论】:

        【解决方案12】:

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

        安装你的包

        pip install .
        

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

        pip uninstall <package_name>
        

        【讨论】:

        • pip unistall . 对我不起作用,但 pip uninstall &lt;package_name&gt; 对我有用,谢谢!
        【解决方案13】:

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

        “pip show”最终引导我找到解决方案,“位置:”指向一个目录,重命名该目录导致打包从 pip 列表中删除。我重命名了目录,它没有重新出现在 pip 的列表中,现在我可以在 virtualenv 中重新安装我的包。

        【讨论】:

          【解决方案14】:

          我曾在我的 PyCharm 中运行过一次python setup.py install,它会将所有软件包安装到我的 conda 基本环境中。稍后当我想删除所有这些包时,pip uninstall 不起作用。我不得不手动从 /anaconda3/lib/python3.7/site-packages 中删除它们:(

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

          【讨论】:

            【解决方案15】:

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

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

            以上解决python3并删除包及其*.egg-info文件

            【讨论】:

              【解决方案16】:

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

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

              【讨论】:

              • 谢谢!从 easy-install.pth 文件中删除相应的行是 唯一 删除通过 python3 setup.py develop 命令安装的 pytorch 的方法。
              【解决方案17】:

              我在 conda 环境下使用python setup.py develop 设置了一个开发鸡蛋链接,并且使用pip uninstall &lt;packagename&gt; 删除了鸡蛋链接。至少在这种情况下,pip uninstall 是一种方法。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-12-03
                • 2012-10-03
                • 1970-01-01
                • 1970-01-01
                • 2011-04-04
                • 1970-01-01
                • 2021-11-13
                • 2020-06-12
                相关资源
                最近更新 更多