连接公司VPN时pip正常但Poetry报连接错误是什么原因?
Poetry VPN环境连接异常问题解决方案
运行环境
- Windows 10
- pip 21.1
- poetry 1.1.8
- poetry-core 1.0.4
问题表现
- 公共WiFi环境下,pip、Poetry均可正常安装软件包
- 连接公司VPN后,pip运行正常,仅Poetry在依赖解析阶段抛出连接重置错误,错误日志如下:
Using version ^6.2.5 for pytest Updating dependencies Resolving dependencies... ConnectionError ('Connection aborted.', ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None)) at c:\users\[redacted]\appdata\local\programs\python\python38\lib\site-packages\requests\adapters.py:498 in send 494¦ low_conn.close() 495¦ raise 496¦ 497¦ except (ProtocolError, socket.error) as err: ? 498¦ raise ConnectionError(err, request=request) 499¦ 500¦ except MaxRetryError as e: 501¦ if isinstance(e.reason, ConnectTimeoutError): 502¦ # TODO: Remove this in 3.0.0: see #2811
根因说明
该问题由Poetry 1.1.x版本的网络配置逻辑差异导致:pip默认会自动读取系统代理、VPN下发的代理规则、pip配置文件中的镜像和证书设置,而1.1.x版本的Poetry默认不会复用上述配置,当公司VPN对对外网络请求做拦截、要求走内部镜像或使用自定义SSL证书时,Poetry发往默认源的请求会被服务端主动断开。
适配1.1.8版本的解决方案(无需升级Poetry)
- 方案一:配置与pip一致的镜像源
执行以下命令配置Poetry的镜像源,和本地pip使用的源保持一致即可:poetry config repositories.pypi <你的pip所用镜像源地址> - 方案二:运行时临时指定代理
执行安装命令时携带VPN代理参数,端口和你本地VPN的代理端口一致:poetry install --proxy http://127.0.0.1:<VPN代理端口> - 方案三:调整SSL配置(仅公司可信网络环境下使用)
关闭TLS验证:poetry config disable-tls true
或配置公司自定义证书路径:poetry config certificates.pypi.cert <公司证书本地存储路径> - 方案四:强制Poetry调用pip执行安装
在项目根目录的pyproject.toml中添加以下配置,开启后Poetry会直接调用底层pip执行所有安装操作,自动复用pip的全部网络配置:
[tool.poetry.installer] pip = true
内容的提问来源于stack exchange,提问作者Azide
相关产品推荐
相关产品推荐

