IronPython无法使用pip安装包报TypeError错误如何解决
故障原因
该故障是PyPI服务端接口调整导致的兼容性问题,和本地IronPython环境损坏、版本新旧无直接关系:
- 2023年末起PyPI官方源默认对所有索引页请求返回gzip压缩格式的响应内容
- IronPython内置的网络请求实现没有自动识别并解压gzip压缩的响应,直接把压缩后的二进制流传给pip内置的html5lib解析器
- 解析器读取到不符合预期的数据流时,内部指针变量返回空值None,执行数值相加操作时触发
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'报错
该问题在IronPython 2.7.12稳定版、3.4 beta版上均可复现,和通过ensurepip安装的pip 19.2.3、setuptools 41.2.0版本本身无关。
修复方案
可根据使用场景选择以下任意一种方案解决:
- 源码补丁方案(推荐,可保留完整在线安装能力)
打开IronPython安装路径下的bin\lib\site-packages\pip\_vendor\requests\adapters.py文件,找到类中build_response方法的末尾,在return response代码行之前插入以下代码:
保存文件后重新执行pip安装命令即可正常使用,不需要重启环境或重装组件。# 处理PyPI返回的gzip压缩响应 if response.headers.get('content-encoding') == 'gzip': import gzip from io import BytesIO compressed_data = BytesIO(response.content) response._content = gzip.GzipFile(fileobj=compressed_data).read() response.headers['content-encoding'] = 'identity' - 离线安装方案
在可正常访问PyPI的CPython环境中,提前下载目标包的纯Python wheel安装包(注意IronPython不支持含C扩展的包,2.7版本需兼容Python 2.7语法,3.4版本需兼容Python 3.4语法),将whl文件拷贝到本地后执行:
该方案全程跳过在线拉取PyPI索引的步骤,不会触发解析报错。ipy.exe -m pip install <本地whl文件的完整路径> - 镜像源替代方案
执行pip安装命令时,指定未强制开启gzip压缩的HTTP协议镜像源,跳过官方源的压缩响应逻辑,命令格式如下:ipy.exe -m pip install <待安装包名> -i <HTTP协议镜像源地址> --trusted-host <镜像源域名>
注意:不要尝试升级内置pip版本,高于19.2.3的pip版本依赖Python 3.6+语法特性,在IronPython环境下无法正常运行。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

