Virtualenv: Setuptools v45.0.0 打破了 Python 2 上的 virtualenv

创建于 2020-01-12  ·  18评论  ·  资料来源: pypa/virtualenv

前言:我对整个 2020 年 1 月 1 日的截止日期非常熟悉,并且正在将 Python 2 放到我所有的项目中,但是 setuptools 的这个惊喜无论如何都非常不方便。 如果你选择不解决这个问题,我不会评判任何人,但请不要教我关于 Python 2 已被弃用 :-)


我在 Python 2 上的所有自动化虚拟环境创建脚本今天开始崩溃。

下面是一个例子:

$ py -2.7-32 -m virtualenv foo
…
UnsupportedPythonVersion: Package 'setuptools' requires a different Python: 2.7.8 not in '>=3.5'
…
OSError: Command …\Scripts\python.exe - setuptools pip wheel failed with error code 1

这似乎是昨天发布的setuptools v45.0.0 引起的:

v45.0.0:2020 年 1 月 11 日

1458:不再支持 Python 2。Setuptools 现在需要 Python 3.5 或更高版本。 使用 pip >=9 或 pin 到 Setuptools <45 安装 setuptools 以保持 2.7 支持。
1959 年:修复 Python 4:用 Six.PY2 替换不安全的 Six.PY3

https://setuptools.readthedocs.io/en/latest/history.html#v45 -0-0

似乎默认情况下, virtualenv尝试安装最新的 setuptools,而pip install setuptools选择setuptools>=45.0.0即使这些版本不支持 Python 2。

作为一种解决方法,我现在使用以下命令:

$ py -2.7-32 -m virtualenv --no-setuptools foo
$ foo\Scripts\python -m pip install "setuptools<45"

我不是 Python 包装中的导出,但我希望setuptools>=45在其分发元数据中声明它不支持 Python 2,并且pip install setuptools会自动检测并避免它,但是这个似乎并非如此。

如果这是不可能的,也许 Python 2 的virtualenv版本应该避免setuptools>=45

最有用的评论

以下为我解决了这个问题。

pip install --upgrade 'setuptools<45.0.0'

所有18条评论

我确认这是一个主要问题。 由于这个原因,在 OpenStack 中,大多数门都被破坏了。 请参阅: http :

感谢您的报告,/我迟到了半小时 - 我认为 virtualenv 会使用 pip 的现代解析器,但它似乎没有。

已经在 setuptools 中跟踪另一个下游https://github.com/pypa/setuptools/issues/1963

不知道为什么 setuptools 45+ 被选中,virtualenvs bootstrap 应该为 setuptools 保留它 44。 🤔

这是回溯: http :

legacy_resolve 听起来像是会丢弃新规则的东西。

不,探索错误的途径,原始 pip 也忽略了 py 版本约束(尽管被宣传为有效): http :

明天我会看看并发布修复程序。 如果有人有时间在此之前进行公关会有所帮助。

@yoctozepto似乎无法复制您的失败; 你能给我们提供三重详细的完整创建日志吗?

@gaborbernat如果它与 pypa/pip#7586 的问题相同,那么这可能是@yoctozepto正在使用的 PyPA 镜像之一中的错误。

显然其中之一没有正确传播python_requires信息。

如果是这样,那么这是该镜像的错误; 与我们自己无关🤷‍♂

以下为我解决了这个问题。

pip install --upgrade 'setuptools<45.0.0'

我正在处理一个仍在使用 python 2.7 :( 的项目,我遇到了同样的问题。
但是,使用上面的命令(由 ikrambabai),它又起作用了!! :D
谢谢!

然而,这在为 python 2.7 创建新的虚拟环境时仍然很重要,因为virtualenv会下载setuptools-45.0.0 ,并且没有升级(通过 pip 使用pip install --upgrade 'setuptools<45.0.0'降级)实际上会删除它. 唯一的解决办法是手动下载轮子。

然而,这在为 python 2.7 创建新的虚拟环境时仍然很重要,因为virtualenv会下载setuptools-45.0.0 ,并且没有升级(通过 pip 使用pip install --upgrade 'setuptools<45.0.0'降级)实际上会删除它. 唯一的解决办法是手动下载轮子。

这应该只发生在你后面的索引服务器不传播 python-requires ......所以我建议修复索引服务器。

@gaborbernat不是我所知道的。 有没有办法让我检查一下?

我可以看到在创建 virtualenv 时下载包时使用了 pythonhosted.org:

Installing setuptools, pkg_resources, pip, wheel...
  Running command /opt/llenv22/bin/python2.7 - setuptools pkg_resources pip wheel
  Collecting setuptools
    Using cached https://files.pythonhosted.org/packages/af/e7/02db816dc88c598281bacebbb7ccf2c9f1a6164942e88f1a0fded8643659/setuptools-45.0.0-py2.py3-none-any.whl
  Collecting pkg_resources
  Collecting pip
    Using cached https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl
  Collecting wheel
    Using cached https://files.pythonhosted.org/packages/00/83/b4a77d044e78ad1a45610eb88f745be2fd2c6d658f9798a15e384b7d57c9/wheel-0.33.6-py2.py3-none-any.whl

pip install setuptools -vvv传入 -v 标志?

这有效并且安装了正确的版本:

Collecting setuptools
  Created temporary directory: /tmp/pip-unpack-zJMfUH
  Starting new HTTPS connection (1): files.pythonhosted.org:443
  https://files.pythonhosted.org:443 "GET /packages/f9/d3/955738b20d3832dfa3cd3d9b07e29a8162edb480bf988332f5e6e48ca444/setuptools-44.0.0-py2.py3-none-any.whl HTTP/1.1" 200 583230
  Downloading setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
     |████████████████████████████████| 583 kB 3.3 MB/s
  Added setuptools from https://files.pythonhosted.org/packages/f9/d3/955738b20d3832dfa3cd3d9b07e29a8162edb480bf988332f5e6e48ca444/setuptools-44.0.0-py2.py3-none-any.whl#sha256=180081a244d0888b0065e18206950d603f6550721bd6f8c0a10221ed467dd78e to build tracker '/tmp/pip-req-tracker-OTDORt'
  Removed setuptools from https://files.pythonhosted.org/packages/f9/d3/955738b20d3832dfa3cd3d9b07e29a8162edb480bf988332f5e6e48ca444/setuptools-44.0.0-py2.py3-none-any.whl#sha256=180081a244d0888b0065e18206950d603f6550721bd6f8c0a10221ed467dd78e from build tracker '/tmp/pip-req-tracker-OTDORt'
Installing collected packages: setuptools
  Created temporary directory: /tmp/pip-unpacked-wheel-vDEYe

只有在创建虚拟环境时才会出现问题。

@ostefano对我来说也是一样。 我通过明确安装setuptools解决了这个问题:

$ py -2.7-32 -m virtualenv --no-setuptools foo
$ foo\Scripts\python -m pip install "setuptools<45"

我们遇到了同样的问题: https :
首先,我认为它是 pythonhosted.org 不尊重Requires-Python标志,但它使用相同的镜像在使用 Python 2.7.13 的 Debian Stretch 上工作,而在使用 Python 2.7.12 的 Ubuntu Xenial 上失败,否则系统设置非常干净,甚至在 Docker 环境中进行了测试。 Python 版本不是原因,因为 Ubuntu Bionic 和 Python 2.7.17 已经报告了相同的问题。

所以我很困惑需要在何处/哪个级别搜索错误,Python、virtualenv、pip、pythonhosted.org 还是中间有什么东西?
解决方法很明确,但最好先调查并修复 setuptools 45 被拉出的原因。

此页面是否有帮助?
0 / 5 - 0 等级