You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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
      配置内容如下:
[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:03:28