如何为setuptools.setup指定非PyPI的第三方包索引地址?
核心结论
不存在可以直接传入setuptools.setup()、完全等效于pip extra-index-url配置的参数。
Python打包PEP规范从设计层面就不允许发布的包元数据强制指定依赖拉取源:源选择是安装工具(pip/uv等)和安装环境的权责,不属于包自身的元数据范畴,这个设计是为了避免恶意包指定第三方恶意源实施依赖投毒。
此前两种方案失效的原因
dependency_links的设计目标是指定单个依赖包的直链下载地址,从来不是用来配置包索引的,该参数自setuptools 19.0版本正式弃用,当前版本的pip默认直接忽略该参数,没有兼容价值。install_requires中的@写法属于PEP 440定义的直接依赖引用语法,要求@后必须跟具体包文件的直链地址,不能填simple索引端点。将索引根地址填入该位置属于语法使用错误,自然会出现无法匹配常规索引拉取逻辑、强制要求源码包的问题。
可行替代方案
方案1:标准规范方案(推荐,无兼容问题)
不要将源配置写在setup.py中,把源配置放在安装环境侧:
- 单次安装时直接给pip传参:
pip install 你的包名 --extra-index-url http://<ARTIFACTORY_HOST>:8082/api/pypi/pypi/simple --trusted-host <ARTIFACTORY_HOST>
- 长期使用可以将源配置写入pip全局/虚拟环境内的配置文件:
- Linux/macOS配置文件名:
pip.conf - Windows配置文件名:
pip.ini
配置内容如下:
- Linux/macOS配置文件名:
[global] extra-index-url = http://<ARTIFACTORY_HOST>:8082/api/pypi/pypi/simple trusted-host = <ARTIFACTORY_HOST>
安全提示:绝对不要把用户名、密码硬编码在URL或者包配置里,会造成凭据泄露。Artifactory的认证请使用pip keyring插件、系统netrc文件或者短期访问Token实现。
方案2:单私有包直链方案(仅适用于少量固定私有依赖)
如果你的私有依赖数量很少、版本固定,可以使用正确的PEP 440直接引用语法,在install_requires里指定具体包文件的直链地址(注意不是索引地址):
from setuptools import setup setup( name="your-package", version="0.1.0", install_requires=[ # 需填写具体whl/源码包的完整直链,不能填写simple索引路径 "mypackage @ http://<ARTIFACTORY_HOST>:8082/artifactory/pypi-local/mypackage/1.2.0/mypackage-1.2.0-py3-none-any.whl" ] )
该方案的缺陷是无法自动解析私有包自身的二级依赖,也不能自动匹配最新版本,仅适合临时、少量依赖的场景。
内容的提问来源于stack exchange,提问作者morfys
相关产品推荐
相关产品推荐

