IronPython 2.7环境pip安装numpy抛出TypeError异常问题求助
问题描述
我在公司实习期间负责将Python集成到现有C#项目的工作,需安装NumPy、SciPy两个库,但受限于旧版本Python环境遇到安装障碍。
我最初执行以下pip命令尝试安装NumPy:
pip install --proxy="proxy:port" numpy
执行后抛出异常,我先尝试升级pip,并未解决问题,报错信息如下:
DEPRECATION: pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality. ERROR: Exception: Traceback (most recent call last): File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\cli\base_command.py", line 223, in _main status = self.run(options, args) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\cli\req_command.py", line 180, in wrapper return func(self, options, args) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\commands\install.py", line 320, in run requirement_set = resolver.resolve( File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\resolution\legacy\resolver.py", line 180, in resolve discovered_reqs.extend(self._resolve_one(requirement_set, req)) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\resolution\legacy\resolver.py", line 385, in _resolve_one dist = self._get_dist_for(req_to_install) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\resolution\legacy\resolver.py", line 336, in _get_dist_for self._populate_link(req) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\resolution\legacy\resolver.py", line 302, in _populate_link req.link = self._find_requirement_link(req) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\resolution\legacy\resolver.py", line 267, in _find_requirement_link best_candidate = self.finder.find_requirement(req, upgrade) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\index\package_finder.py", line 899, in find_requirement best_candidate_result = self.find_best_candidate( File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\index\package_finder.py", line 882, in find_best_candidate candidates = self.find_all_candidates(project_name) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\index\package_finder.py", line 825, in find_all_candidates package_links = self.process_project_url( File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\index\package_finder.py", line 789, in process_project_url html_page = self._link_collector.fetch_page(project_url) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\index\collector.py", line 618, in fetch_page return _get_html_page(location, session=self.session) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\index\collector.py", line 430, in _get_html_page resp = _get_html_response(url, session=session) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\index\collector.py", line 127, in _get_html_response resp = session.get( File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_vendor\requests\sessions.py", line 555, in get return self.request('GET', url, **kwargs) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_internal\network\session.py", line 428, in request return super(PipSession, self).request(method, url, *args, **kwargs) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_vendor\requests\sessions.py", line 528, in request prep = self.prepare_request(req) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_vendor\requests\sessions.py", line 456, in prepare_request p.prepare( File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_vendor\requests\models.py", line 316, in prepare self.prepare_url(url, params) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_vendor\requests\models.py", line 382, in prepare_url scheme, auth, host, port, path, query, fragment = parse_url(url) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_vendor\urllib3\util\url.py", line 381, in parse_url host = _normalize_host(host, scheme) File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_vendor\urllib3\util\url.py", line 296, in _normalize_host return six.ensure_str( File "c:\program files\ironpython 2.7\Lib\site-packages\pip\_vendor\urllib3\packages\six.py", line 951, in ensure_str raise TypeError("not expecting type '%s'" % type(s)) TypeError: not expecting type '<type 'bytes'>'
10月6日更新:
我修改pip安装命令,指定安装兼容Python2.7的最后一个NumPy版本1.6.6:
pip install --proxy="proxy:port" numpy==1.6.6
依旧报相同TypeError错误,仅异常抛出的文件位置不同,报错如下:
pip install --proxy="xxx:port" --user numpy==1.6.6 WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip. Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue. To avoid this problem you can invoke Python with '-m pip' instead of running pip directly. DEPRECATION: A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support ERROR: Exception: Traceback (most recent call last): File "C:\Users\FurkanK\AppData\Roaming\Python\IronPython27\site-packages\pip\_internal\cli\base_command.py", line 186, in _main status = self.run(options, args) File "c:\program files\ironpython 2.7\Lib\contextlib.py", line 35, in __exit__ self.gen.throw(type, value, traceback) File "c:\program files\ironpython 2.7\Lib\contextlib.py", line 35, in __exit__ self.gen.throw(type, value, traceback) File "C:\Users\FurkanK\AppData\Roaming\Python\IronPython27\site-packages\pip\_internal\req\req_tracker.py", line 42, in update_env_context_manager yield TypeError: not expecting type '<type 'bytes'>'
之后我将pip版本降级到20.0.1:
pip install pip==20.0.1
降级后再次尝试安装numpy==1.6.6,仍然报错。我推测问题可能出在2.7.11版本的IronPython上,更换pip版本也无法解决,请问该问题的诱因是什么,有什么解决办法?
问题诱因
这个报错的核心原因有两个:
- IronPython 2.7.11的字符串类型实现和标准CPython 2.7存在差异,网络请求返回的部分内容被默认处理为bytes类型,但pip依赖的urllib3、six库的Python2兼容分支只接收str类型输入,类型校验不通过就抛出该TypeError。
- 标准NumPy、SciPy都是基于CPython的C扩展开发的,本身就不支持IronPython运行环境,哪怕解决了pip的安装报错,后续也无法正常导入使用这两个库。
可行解决方案
你可以根据项目的实际约束选择以下方案:
- 方案1:改用进程调用标准CPython
不在C#项目中直接集成IronPython,单独安装适配NumPy、SciPy的Python3版本,C#侧通过进程调用的方式执行Python计算逻辑,用标准输入输出、临时文件或者本地Socket传递数据。该方案兼容性最高,不需要修改现有Python代码。 - 方案2:使用.NET原生科学计算库替代
直接放弃依赖Python,改用Numpy.NET、MathNet.Numerics这类原生.NET实现的科学计算库,功能覆盖大部分常用的NumPy、SciPy接口,可以直接在C#代码中调用,不需要额外部署Python运行时。 - 方案3:手动修复pip逻辑(仅作临时验证,不推荐生产使用)
找到报错的six.py中ensure_str方法的位置,在方法入口添加判断逻辑:如果输入是bytes类型,先调用.decode('utf-8')转成str类型再走后续校验。修复完成后也只能走离线安装流程,需要自行下载适配IronPython的NumPy安装包本地安装,官方PyPI源没有提供对应适配包。
内容的提问来源于stack exchange,提问作者Ifloop
相关产品推荐
相关产品推荐

