Python3.7.9环境导入Qiskit触发numpy二进制不兼容报错
报错本质
这个问题是预编译二进制扩展与本地numpy版本的内存结构不匹配导致的。
报错栈最后触发的校验逻辑是:qiskit Aer内置的、用Cython提前编译好的稀疏矩阵计算模块,是基于特定版本的numpy C头文件构建的,它会在导入时校验当前运行环境下numpy.ndarray对象的内存结构大小和编译时的预期值是否一致。你当前环境下两者不一致(编译预期是88字节的结构体,实际运行的numpy是80字节的结构体),就直接抛出了这个ValueError。
你之前反复切换numpy版本仍然报错,核心原因有两个:
- 没有彻底清理site-packages目录下残留的旧qiskit编译文件,哪怕换了numpy版本,旧的二进制扩展还是会被优先加载
- 你尝试的numpy版本(1.16、1.17、最新版)和当前pip源为Python3.7.9提供的qiskit安装包的编译基线完全不匹配,两边对不上自然会触发校验失败
适配你环境的排错方案
你的场景有明确约束:Python3.7.9环境,需要兼容机器学习项目的依赖版本,不能随意调整核心依赖的版本号破坏原有环境。按照下面的步骤操作即可,不会影响你已有的机器学习依赖:
- 第一步:先确认你当前机器学习项目匹配的numpy版本,跑
pip show numpy记录下版本号。对于Python3.7生态的机器学习项目,绝大多数兼容的numpy版本是1.21.6(这也是numpy官方最后一个支持Python3.7的版本,和TensorFlow 2.11、PyTorch1.13、scikit-learn1.0.x等常用库完全兼容) - 第二步:彻底清理残留的qiskit文件:
- 执行
pip uninstall qiskit qiskit-aer qiskit-ibmq-provider -y - 手动打开
C:\Users\你的用户名\AppData\Roaming\Python\Python37\site-packages,删掉所有带qiskit前缀的残留文件夹 - 执行
pip cache purge清空pip的安装缓存,避免旧包被重复加载
- 执行
- 第三步:安装和当前numpy版本严格匹配的qiskit版本,不要装最新版:
执行安装命令pip install qiskit==0.36.1 qiskit-aer==0.10.4
这个版本组合是qiskit官方最后一个支持Python3.7的稳定线,其内置的Aer扩展就是基于numpy1.21.x的头文件编译的,和你用来跑机器学习项目的numpy版本完全匹配,不会触发二进制校验报错,也不会改动你现有环境的numpy版本。 - 临时绕行方案(适合完全不需要用到qiskit脉冲仿真功能的场景):
如果你不需要调用PulseSimulator相关功能,所有的量子电路仿真都用基础的Qasm/Statevector模拟器,不需要改动现有qiskit和numpy版本的话,可以在导入qiskit之前,通过给sys.modules添加占位模块的方式,跳过触发报错的pulse模块加载链路,直接绕开那个存在二进制不兼容的Cython稀疏矩阵模块,就能正常导入核心的QuantumCircuit、execute、Aer对象,完全不影响常规量子电路仿真的使用。
注意:不要为了适配qiskit随意把numpy降到1.16、1.17这类过老的版本,这类版本已经不兼容绝大多数在Python3.7上运行的机器学习库,会直接破坏你原有项目的运行环境。
内容的提问来源于stack exchange,提问作者X10nD
相关产品推荐
相关产品推荐

