【问题标题】:Why is pip installing an old version of my package?为什么 pip 安装我的包的旧版本?
【发布时间】:2013-01-15 01:03:21
【问题描述】:

我刚刚将我的包的新版本上传到 PyPi (1.2.1.0-r4):我可以下载 egg 文件并使用 easy_install 安装它,并且版本检查正确。但是当我尝试使用 pip 安装时,它会安装 1.1.0.0 版本。即使我使用pip install -Iv tome==1.2.1.0-r4 明确指定要pip 的版本,我也会收到此消息:Requested tome==1.2.1.0-r4, but installing version 1.1.0.0,但我不明白为什么。

我仔细检查了parse_version,并确认 1.2.1 上的版本字符串大于 1.1.0 上的版本字符串,如图所示:

>>> from pkg_resources import parse_version as pv
>>> pv('1.1.0.0') < pv('1.2.1.0-r4')
True
>>>

那么知道为什么它选择安装 1.1.0 吗?

【问题讨论】:

  • 无法重现。 pip install -Iv tome==1.2.1.0-r4 为我安装(根据消息和pip freezetome==1.2.1.0-r4
  • 它可能还在你的路径中的某个地方?试试-U
  • 嗯..好吧,这很有趣。我试过用 pip 卸载它,我想我得再挖掘一些,确保它都消失了。感谢您的检查!
  • 看起来像 pip 中的某种错误。我有类似的问题,但我无法安装旧版本的 django-tastypie。
  • 相关,我遇到了类似的问题 pip install -e stackoverflow.com/questions/69303363/…

标签: python pip setuptools


【解决方案1】:

这是一个很好的问题。我花了很长时间才弄清楚。这是适合我的解决方案:

显然,如果pip 可以找到包的本地版本,pip 将更喜欢本地版本而不是远程版本。我什至断开了我的计算机与互联网的连接并再次尝试——当pip 仍然成功安装了软件包,甚至没有抱怨时,来源显然是本地的。

就我而言,真正令人困惑的部分是pippypi 上找到了较新的版本,并报告了它们,然后继续重新安装了旧版本……唉。此外,它没有告诉我它在做什么,以及为什么。

那么我是如何解决这个问题的呢?

您可以让pip 使用-v 标志提供详细的输出......但一个还不够。我 RTFM 编辑了帮助,它说您可以多次执行-v,最多 3 次,以获得更详细的输出。所以我做了:

pip install -vvv <my_package>

然后我查看了输出。一行引起了我的注意:

/tmp/pip-build-root/ 中的源代码版本为 0.0.11,满足要求

我删除了那个目录,之后pip从pypi安装了最新版本。

【讨论】:

  • 看起来这个问题还没有解决。
  • @Ale110 已修复 - 有关详细信息,请参阅我的答案。
  • 仅供参考,您可以使用-vvv 而不是-v -v -v
  • 您也可以使用--no-cache-dir 标志而不是查找并删除/tmp/ 中的文件。
  • 在我的机器上进行 pip 安装需要很长时间...如何找到这些文件的位置?我可以在 pip 列表中看到它,但它没有指向路径。有什么帮助吗?
【解决方案2】:

尝试使用以下命令再次强制下载包:

pip install --no-cache-dir --upgrade <package>

【讨论】:

  • 这对我有用。终于在 v0.2.1 上安装了 v0.4 的 photoutils。 Pip 正在下载 v0.4 tar,但它只会安装(或保留)v0.2.1。 --no-cache-dir 和 --upgrade 标志终于做到了!谢谢
  • 这是正确的答案。默认情况下,Pip 将相关 Pypi 页面的缓存保留 600 秒。因此,即使您删除了本地缓存的包,您也必须等待 10 分钟让 pip 获取包含所有新版本链接的新页面。
  • 这似乎是一个非常合乎逻辑的答案。但是,即使我通过 pip search 看到的版本更新,pip 仍然安装得到相同的旧版本。
  • 尝试检查它是否与virtualenv有关。啊python版本。
  • 这是否适用于可编辑模式,例如pip install -e --no-cache-dir --upgrade ~/ultimate-utils/ultimate-utils-proj-src?
【解决方案3】:

感谢Marcus Smith,他作为 pip 的维护者做出了惊人的工作,这个问题在 2013 年 7 月 23 日发布的 pip 1.4 版中得到了修复。

来自changelog此版本的相关信息

修复了与 清理而不是重用构建目录。 (拉#865、#948)

【讨论】:

  • 这应该被标记为正确答案。像这样升级 pip:pip install -U pip
  • 此修复仍然无法使用缓存版本静默解决 pip 问题,可以使用 Iacchus 的答案解决
  • 不,它似乎没有修复。我现在遇到了同样的问题。
【解决方案4】:

我发现here 在 pip 中存在一个已知错误,如果存在带有解压缩源的构建目录,它将不会检查版本。我已经在我的麻烦包上检查了这一点,并在从构建目录中删除它的源后 pip 安装了所需的版本。

【讨论】:

  • 感谢您的信息。知道我应该在哪里查找构建目录吗?我尝试从 Python\Lib\site-packages 中删除它,但结果是一样的。我没有从包存在的位置或任何地方执行命令。
  • @sh1ftst0rm 我在 linux 下使用 virtualenv,对于 django-tastypie 它是:“$VIRTUAL_ENV/build/django-tastypie”。尝试检查 Python 目录的顶部或仅在系统中使用搜索。您也可以尝试使用“pip install -b ”。
  • 这似乎不是我的问题,我已经进行了广泛的搜索,在我的系统上找不到任何包或构建目录的痕迹。它一定是 pip =( 中的其他错误。无论如何,这是个好提示,我相信这将是很多人的解决方案。
【解决方案5】:

如果您使用的是带有某些分发包(例如 Ubuntu python-pip)的pip 版本,您可能需要安装更新的pip 版本:

pip更新到最新版本:

sudo pip install -U pip

如果是“virtualenv”,跳过“sudo”:

pip install -U pip

如果您的 shell 在 pip 更新后报告类似 -bash: /usr/bin/pip: No such file or directory 的内容,则可能需要以下命令:

hash -d pip

现在像往常一样安装你的包:

pip install -U foo

pip install foo==package.version.here

【讨论】:

    【解决方案6】:

    将 pika 0.9.5 更新到 0.9.8 时遇到了同样的问题。唯一可行的方法是从 tarball 安装:pip install https://pypi.python.org/packages/source/p/pika/pika-0.9.8.tar.gz

    【讨论】:

    • +1 谢谢,这让我明白了一些重要的事情:pip 依赖于源分布:在我的最新版本中,我忘记上传源 dist,所以当我尝试安装时,它只会得到以前的版本。这并不能解决我最初的问题,但了解一下会很有帮助。
    【解决方案7】:

    在我的情况下,使用的 python 版本 (3.4) 不满足 Django 2.1 依赖项要求 (python >= 3.5)。

    【讨论】:

      【解决方案8】:

      就我而言,我必须删除主目录中的 .pip 文件夹,然后才能获得多个库的更高版本。请注意,这是在 linux 上。

      pip --version
      pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)
      virtualenv --version
      15.1.0
      

      【讨论】:

        【解决方案9】:

        以防万一其他人在升级 torchtext(或者可能是任何其他 torch 库)时遇到麻烦:

        虽然https://pypi.org/project/torchtext/ 声明你可以运行pip install torchtext,但我必须通过指定--find-links 又名-f 来安装它类似于torch

        pip install torchtext===0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
        

        让我恼火的是 PyCharm 将我指向新版本,但在尝试升级到它时却找不到它。我猜 PyCharm 使用它自己的机制来发现新版本。然后,在后台调用pip 时,它没有找到没有--find-links 选项的新版本。

        【讨论】:

          【解决方案10】:

          我发现如果您使用微版本,pip 似乎无法识别它们。例如,我们无法升级 1.9.9.1 版本。

          【讨论】:

          • 可能是因为 '1.9.9.1' 与 SemVer 不兼容,请参阅 semver.org
          【解决方案11】:

          在我的例子中,有人使用 python2 发布了最新版本的包,因此尝试pip3 install 它抓取了一个旧版本, 使用 python3 构建。

          调试时要检查的方便事项:

          • 如果pip install声称找不到版本,看看pip search是否可以看到。
          • 看看 pypi repo 上的“下载文件”部分——文件名可能表明出了什么问题(在我的例子中,我看到 -py2- 在那里很清楚)。
          • 按照其他人的建议,尝试运行 pip install --no-cache-dir,以防 pip 懒得上网询问,因为它已经在本地找到了您的答案。

          【讨论】:

            【解决方案12】:

            我在 PyCharm 的 Git 选项卡下隐藏了使用 pip install . 安装的未版本控制文件,即使我在其他任何地方都没有看到这些文件。

            花了很长时间才找到它,发布这个希望它可以帮助其他人。

            【讨论】:

              【解决方案13】:

              就我而言,我正在 pip 安装来自 Artifactory 的 .tar.gz 包,我对其进行了大量更新。为了覆盖我缓存的 Python 文件并始终获取/安装我能够运行的最新版本:

              pip install --no-cache-dir --force-reinstall <path/to/tar.gz>
              

              您应该会看到重新下载任何必要的文件并安装这些文件,而不是使用本地缓存。

              【讨论】:

                【解决方案14】:

                如果您需要包的路径,请执行pip -v list。使用 pip -e Why is an old version of a package of my python library installing by itself with pip -e?时的示例见相关帖子

                【讨论】:

                  猜你喜欢
                  • 2020-08-18
                  • 2017-06-05
                  • 2021-11-17
                  • 1970-01-01
                  • 2020-03-25
                  • 2020-09-18
                  • 2015-12-07
                  • 2014-05-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多