安装AstroPhoto-Plus时出现cffi包与_cffi_backend版本不匹配问题求助
问题背景
你在安装AstroPhoto-Plus后运行程序时,碰到了恼人的cffi版本不匹配错误:
Exception: Version mismatch: this is the 'cffi' package version 1.14.6, located in '/tmp/pip-build-env-34pknb8l/overlay/lib/python3.8/site-packages/cffi/api.py'. When we import the top-level '_cffi_backend' extension module, we get version 1.14.0, located in '/usr/lib/python3/dist-packages/_cffi_backend.cpython-38-arm-linux-gnueabihf.so'. The two versions should be equal; check your installation.
虽然你已经通过pip把cffi升级到了1.14.6,但系统里预安装的cffi核心C扩展模块(_cffi_backend)还是旧的1.14.0版本,这就导致了两者版本不兼容,程序跑不起来。
问题原因
cffi这个包其实分两部分:
- 纯Python代码部分:就是你通过pip安装/升级的那部分,存在
~/.local/lib/python3.8/site-packages里 - 编译后的C扩展模块:也就是
_cffi_backend,这是系统级别的安装包,存在/usr/lib/python3/dist-packages里
你只更新了纯Python部分,但系统里的C扩展模块没同步更新,所以程序加载时就会报错说版本对不上。
解决方案
方法1:强制重新编译安装cffi(推荐)
用pip重新安装cffi时,加上--force-reinstall和--no-binary :all:参数,强制从源码编译出匹配你当前系统的C扩展模块,替换掉旧的版本:
pip install --force-reinstall --no-binary :all: cffi==1.14.6
这个命令会重新编译cffi,生成和你的Python环境完全匹配的_cffi_backend模块,从根源上解决版本不一致的问题。
方法2:降级纯Python部分到系统C扩展的版本
如果编译源码遇到麻烦,也可以反过来,把pip安装的cffi降级到系统C扩展的1.14.0版本,让两者版本统一:
pip install cffi==1.14.0 --force-reinstall
这样纯Python代码和C扩展模块版本一致,就不会再出现版本不匹配的错误了。
方法3:用虚拟环境隔离依赖(更彻底的方案)
如果你不想动系统全局的Python依赖,可以创建一个独立的虚拟环境,在环境里单独安装AstroPhoto-Plus和对应的依赖,完全隔离系统环境的影响:
# 先安装虚拟环境工具(如果还没装的话) sudo apt install python3-venv # 创建一个名为astro_env的虚拟环境 python3 -m venv astro_env # 激活虚拟环境 source astro_env/bin/activate # 在虚拟环境里安装AstroPhoto-Plus pip install git+https://github.com/GuLinux/AstroPhoto-Plus.git # 现在直接运行程序就行(记得要在虚拟环境激活状态下) astrophoto-plus
虚拟环境会自己管理一套独立的依赖包,不会和系统全局的包产生冲突。
验证解决效果
执行完上面的方法后,你可以检查一下cffi的两个部分版本是否一致:
# 查看pip安装的cffi版本 pip show cffi # 查看C扩展模块的版本 python3 -c "import _cffi_backend; print(_cffi_backend.__version__)"
如果两个版本显示相同,就说明问题已经解决了,再运行AstroPhoto-Plus应该就能正常工作了。
内容的提问来源于stack exchange,提问作者Astro-Otter

