setup.py 不尊重 PIP_INDEX_URL

Posted

技术标签:

【中文标题】setup.py 不尊重 PIP_INDEX_URL【英文标题】:setup.py not honoring PIP_INDEX_URL 【发布时间】:2014-03-08 09:29:29 【问题描述】:

我正在运行本地 pypi server。我可以通过使用pip 命令的-i 选项或设置PIP_INDEX_URL 环境变量来从该服务器安装软件包。当我安装具有先决条件的软件包时,setup.py 历来尊重 PIP_INDEX_URL 环境变量,从我的本地服务器中提取额外的软件包。

但是,在最近安装的几个系统上,它的行为有所不同。例如,运行 python setup.py develop 失败,因为它尝试从 pypi.python.org 安装必备软件包。

我已经在我正在测试的所有系统上更新了所有相关的 python 包(pythondistributevirtualenvpip 等...),并继续看到这种差异。在我的“原始”系统上,setup.py 从我的PIP_INDEX_URL 环境变量中指定的pypi 服务器下载先决条件。在较新的系统上,我似乎无法让它尊重这个变量。

我错过了什么?

【问题讨论】:

看来***.com/questions/3472430/… 部分回答了这个问题。它没有解释为什么环境变量被不一致地尊重,但它确实告诉我如何通过指定dependency_links来解决我的问题。 我终于找到了罪魁祸首。在旧服务器上,我有一个 ~/.pydistutils 文件,它指示 easy_install 使用我的 pypi 服务器。在新服务器上创建此文件后,我的部署再次工作。它仍然不使用 PIP_INDEX_URL 变量,但这给了我一个解决方法。 【参考方案1】:

我遇到了同样的问题。从根本上说,setup.py 使用的是setuptools,它利用了easy_install,而不是pip。因此,它会忽略您设置的任何 pip-related 环境变量。

您可以运行 pip(从包的顶部)pip install -e . 来产生相同的效果,而不是使用 python setup.py develop

【讨论】:

【参考方案2】:

在与您的setup.py 相同的文件夹中创建setup.cfg,内容如下:

[easy_install]
allow_hosts = *.myintranet.example.com

发件人:http://pythonhosted.org/setuptools/easy_install.html#restricting-downloads-with-allow-hosts

您可以使用--allow-hosts (-H) 选项来限制 EasyInstall 将在哪些域上查找链接和下载。

--allow-hosts=None 完全阻止下载。

【讨论】:

感谢您的信息。我会试试看。不过,我仍然对为什么我看到运行相同软件的系统之间的行为不同感到困惑。 @zenzic 如果你使用python setup.py develop,那么distutils 负责安装。背景信息有一篇文章总结了python打包的(对不起)状态:lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere 这是我所期望但没有看到的。我仍在努力解决这个问题,并没有找到可接受的解决方案。归根结底,python setup.py develop 使用 easy_install 安装 setup.py (install_requires) 中指定的依赖项。 easy_install 忽略 PIP_INDEX_URL 环境变量。我不想在 setup.py 或 setup.cfg 中硬编码索引服务器,我希望它使用环境中指定的服务器。有没有更好的方法来做到这一点?

以上是关于setup.py 不尊重 PIP_INDEX_URL的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 setup.py 文件的情况下构建源代码分发?

setup.py:限制python解释器的允许版本

一个关于python3中setup.py小概念

python setup.py install 出错

Python安装setup.py,明明有文件却提示文件不存在?

requirements.txt 与 setup.py