根本原因是凭据未绑定到正确仓库名或Poetry默认不向私有源发送认证头;需确保pyproject.toml中source的name与poetry config http-basic.<name>完全一致,并显式配置仓库URL和凭据。

poetry config 为什么配了私有源却还是拉不到包
根本原因通常是凭据没绑定到正确的仓库名,或者 Poetry 默认只信任 https://pypi.org,对私有源默认不发送认证头。即使你在 pyproject.toml 里写了 [[tool.poetry.source]],Poetry 也不会自动读取系统凭据或环境变量——它只认自己管理的凭据库。
实操建议:
立即学习“Python免费学习笔记(深入)”;
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 先确认私有源在
pyproject.toml中定义的name字段(比如my-private),后续所有凭据操作都必须严格匹配这个名字 - 运行
poetry config repositories.my-private https://pypi.example.com/simple/显式注册仓库(仅注册 URL 不含认证) - 再用
poetry config http-basic.my-private username password绑定凭据——注意这里my-private必须和 source 的 name 完全一致 - 如果密码含特殊字符(如
@、/),需 URL 编码;推荐改用poetry config http-basic.my-private username "your-raw-password"并加英文双引号包裹
使用 API token 而不是用户名密码时怎么配
多数现代私有 PyPI(如 Nexus、Artifactory、JFrog)推荐用 token 替代明文密码,但 Poetry 不区分“密码”字段语义,一律当密码处理。关键点在于:token 通常要作为用户名传入,密码留空或填占位符。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 若服务端要求 token 放在 Authorization 头的 Bearer 位置(如某些 Nexus 配置),Poetry 原生不支持;此时必须退回到
.pypirc+poetry config virtualenvs.create false手动 pip install,或改用pip index config(Poetry 1.7+ 实验性支持) - 更通用的做法是:把 token 当作用户名,密码设为空字符串——执行
poetry config http-basic.my-private "APITOKEN-abc123" "" - 验证是否生效:运行
poetry config --list | grep http-basic,确认输出包含http-basic.my-private对应项
CI 环境下如何安全注入私有源凭据
CI(如 GitHub Actions、GitLab CI)里不能硬编码密码到 pyproject.toml 或 shell 脚本中。Poetry 本身不读取 $POETRY_HTTP_BASIC_USERNAME 这类环境变量,必须显式调用 poetry config。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- GitHub Actions 示例:在 job 步骤中插入
poetry config http-basic.my-private "${{ secrets.PRIVATE_PYPI_USERNAME }}" "${{ secrets.PRIVATE_PYPI_PASSWORD }}" - GitLab CI 示例:用
before_script执行poetry config http-basic.my-private "$PRIVATE_PYPI_USERNAME" "$PRIVATE_PYPI_PASSWORD",并确保变量在 CI 设置中标记为 masked - 切忌在 CI 中执行
poetry config --local,因为--local会写入项目根目录下的poetry.toml,可能意外提交到 Git - 每次 CI 启动新容器时,凭据都是干净的,所以务必把
poetry config放在poetry install或poetry publish之前
poetry publish 推送包到私有源失败的常见卡点
poetry publish 默认推送到 PyPI 官方源,即使你配置了私有源,也必须显式指定 -r 参数,否则会报 HTTP Error 403: Forbidden(因为它试图往 pypi.org 推,而你没给官方账号权限)。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 推送前确认已运行
poetry config repositories.my-private https://pypi.example.com/simple/和poetry config http-basic.my-private ... - 推送命令必须带
-r my-private:例如poetry publish -r my-private --build - 注意私有源的上传 endpoint 通常是
/simple/的父路径(比如https://pypi.example.com/),但 Poetry 的repositories.<name>配置值必须以/simple/结尾,否则publish会拼错 URL - 如果遇到
ConnectionError或证书错误,在 CI 中可临时加poetry config certificates.my-private.cert /path/to/cert.pem(仅限自签名证书场景)
name 和 http-basic.<name> 之间大小写、连字符、下划线的完全一致性——Poetry 不做 normalize,错一个字符就查不到凭据。

















