1 背景
这个问题是在安装arm机器上编译好的python包tensorflow==2.6.5的wheel文件遇到。
背景是官方tensorflow==2.6.5没有提供arm架构的包,无法使用pip安装,因此需要在arm机器上自己编译wheel文件。而在安装编译好了的wheel文件的时候,pip会安装依赖,包括h5py这个包,pip会编译h5py包,从而导致错误。如下:
2 原因
官方的解释是h5py低版本只能用Cython==0.29.xx版本编译,不能用3.xx.xx版本,否则会导致编译错误。
参考:https://github.com/h5py/h5py/issues/2300
3 解决办法
既然Cython版本不对,那么思路就是编译h5py的时候指定正确Cython版本,刚开始在安装tensorflow之前,先提前安装指定版本的Cython库,发现仍然还有问题,提前安装的Cython不生效。pip在编译安装的时候,会在独立的环境中拉去Cython,也就是说我们通过pip提前安装Cython是无意义的。
正确办法:
我们发现安装tensorflow==2.6.5的时候,安装的h5py依赖版本是3.1.0,我们从h5py-3.1.0.tar.gz下载h5py的源码包,将源码包解压,打开setup.py文件,如下:
我们发现这里定义了安装时依赖的Cython版本。在Cython 3.xx.xx版本还没出来的时候,这个版本限制是没有问题的,但是Cython 3.xx.xx出来后,这里就会拉到3.xx.xx的版本,导致编译出错。
因此,我把版本限制改为如下:
重新打包为h5py-3.1.0-new.tar.gz,我们在安装tensorflow之前提前安装新的h5py包。执行如下命令:
pip install h5py-3.1.0-new.tar.gz
安装完后再安环tensorbord,完美解决。
4 总结
核心原因就是h5py-3.1.0的setup.py文件对Cython的版本限制不够严谨,只考虑到版本必须大于某个版本的情况。在3.x.x版本没出来之前,没有问题,但是3.x.x版本出来后,由于3.x.x不向下兼容,导致问题发生。