pip安装pytrec_eval遇ssl.SSLCertVerificationError错误求助
问题描述
在Ubuntu 9.4.0系统的conda环境(Python=3.9)中执行python -m pip install pytrec_eval安装pytrec_eval包时失败,报错如下:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1133)
仅该包出现此错误,其他包安装正常,完整错误日志:
Collecting pytrec_eval Using cached pytrec_eval-0.5.tar.gz (15 kB) Preparing metadata (setup.py): started Preparing metadata (setup.py): finished with status 'error' error: subprocess-exited-with-error × python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [44 lines of output] Traceback (most recent call last): File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/urllib/request.py", line 1346, in do_open h.request(req.get_method(), req.selector, req.data, headers, File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/http/client.py", line 1285, in request self._send_request(method, url, body, headers, encode_chunked) File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/http/client.py", line 1331, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/http/client.py", line 1280, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/http/client.py", line 1040, in _send_output self.send(msg) File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/http/client.py", line 980, in send self.connect() File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/http/client.py", line 1454, in connect self.sock = self._context.wrap_socket(self.sock, File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/ssl.py", line 501, in wrap_socket return self.sslsocket_class._create( File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/ssl.py", line 1074, in _create self.do_handshake() File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/ssl.py", line 1343, in do_handshake self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1133) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<string>", line 2, in <module> File "<pip-setuptools-caller>", line 34, in <module> File "/tmp/pip-install-d8_09f0p/pytrec-eval_ea7e63f86646420cbfc12ae9c46aac88/setup.py", line 27, in <module> response = urllib.request.urlopen(REMOTE_TREC_EVAL_URI) File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/urllib/request.py", line 214, in urlopen return opener.open(url, data, timeout) File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/urllib/request.py", line 517, in open response = self._open(req, data) File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/urllib/request.py", line 534, in _open result = self._call_chain(self.handle_open, protocol, protocol + File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/urllib/request.py", line 494, in _call_chain result = func(*args) File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/urllib/request.py", line 1389, in https_open return self.do_open(http.client.HTTPSConnection, req, File "/home/myusername/miniconda3/envs/hipporag-py39/lib/python3.9/urllib/request.py", line 1349, in do_open raise URLError(err) urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1133)> Fetching trec_eval from https://github.com/usnistgov/trec_eval/archive/v9.0.8.tar.gz. [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed × Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with the package mentioned above, not pip. hint: See above for details.
原因分析
pytrec_eval的setup.py在安装过程中会主动通过urllib请求GitHub上的trec_eval源码包,而你的环境处于使用自签名证书的网络中,urllib默认会严格验证SSL证书,导致请求失败。其他包安装正常是因为它们的安装流程不会触发这种额外的外部请求,或者pip本身已经配置了证书信任。
解决方法
方法1:临时跳过SSL验证安装
在安装时设置环境变量,让Python的urllib跳过SSL证书验证:
export PYTHONHTTPSVERIFY=0 && python -m pip install pytrec_eval
安装完成后可取消该环境变量:
unset PYTHONHTTPSVERIFY
方法2:手动下载依赖后本地安装
- 手动下载trec_eval源码包:
wget --no-check-certificate https://github.com/usnistgov/trec_eval/archive/v9.0.8.tar.gz - 下载pytrec_eval源码包(若此步骤也有SSL问题,可添加
--trusted-host pypi.org --trusted-host files.pythonhosted.org参数):pip download pytrec_eval - 解压pytrec_eval源码包,修改其中的
setup.py,将REMOTE_TREC_EVAL_URI的值改为本地下载的trec_eval包路径,例如:REMOTE_TREC_EVAL_URI = "/path/to/your/downloaded/v9.0.8.tar.gz" - 进入pytrec_eval解压目录,执行本地安装:
python setup.py install
方法3:配置Python信任自签名证书
将自签名证书添加到Python的信任列表:
- 查找conda环境中的证书存储路径:
python -c "import ssl; print(ssl.get_default_verify_paths())" - 将自签名证书复制到该路径下的
cafile或capath对应位置 - 设置环境变量让Python加载该证书后安装:
export SSL_CERT_FILE=/path/to/your/certificate.crt python -m pip install pytrec_eval
内容的提问来源于stack exchange,提问作者Betty
相关产品推荐
相关产品推荐

