setup.py 可以使用 pip 而不是 easy_install 吗?

4 投票
3 回答
1101 浏览
提问于 2025-04-17 21:13

我已经尝试解决这个问题一段时间了,甚至在这里问过这个问题,但问得不太好。自那以后,我对发生的事情有了更好的理解。我认为问题的根源在于,当我运行python setup.py [install|develop]时,它试图用easy_install来满足依赖项(install_requires),而不是用pip。

这听起来可能没什么问题,但我自己有一个pypi服务器,所有这些依赖项都存储在那儿。我可以通过设置PIP_INDEX_URL环境变量来指定pip使用我的索引服务器。在用pip install进行部署时,这个方法很好用,但在开发时,我希望能方便地用setup.py develop来安装。从我观察到的情况来看,setup.py调用了easy_install,而它并不关注这个环境变量,试图在pypi.python.org上寻找我的包。我知道在命令行中,我可以为easy_install指定一个索引服务器,但在从setup.py隐式调用时,我看不到这样做的方法。

我更困惑的是,pip并没有遇到这个问题。当我用pip install安装这些模块时,它会运行我的包的setup.py,但会从我的索引服务器获取依赖项。为什么在pip下运行setup.py的行为和我直接调用它时不同呢?

在setup.py中指定dependency_links并不是一个好办法,因为我希望我的环境来决定使用哪个pypi服务器(例如,生产环境、测试环境或开发环境)。

我觉得我的设置并不奇怪,所以肯定还有其他人遇到过并解决了这个问题。

3 个回答

0

这并没有真正回答我的问题,因为我还是不知道怎么让setup.py使用pip,而不是easy_install。不过,我找到了解决我问题的方法。你可以通过在你的~/.pydistutils文件中指定你想要的索引服务器,强制easy_install使用它。可以像这样写:

[easy_install]
index_url = http://pypi.my_domain.org/simple
2

你可能会对pip的“可编辑安装”选项感兴趣,这个选项是通过-e这个标志来指定的:

所谓“可编辑”安装,实际上就是“setuptools开发模式”的安装方式。

对于本地项目来说,会在项目路径下创建一个“SomeProject.egg-info”目录。这比直接使用setup.py develop要好,因为后者是直接在当前工作目录下创建“egg-info”。

3

为什么在用pip运行setup.py时,它的表现和我直接运行它时不一样呢?

PIP_INDEX_URL这个环境变量是pip的一个功能。

你的setup.py文件使用了setuptools,而setuptools并不知道PIP_INDEX_URL这个东西。

我建议你使用:

PIP_INDEX_URL=http://yourpypi/ pip install .

而不是

python setup.py install

撰写回答