
科学计算【免费下载链接】qiskitQiskit is an open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.项目地址https://gitcode.com/gh_mirrors/qi/qiskit点击查看免费下载本文以 Qiskit 仓库中的 docs/apidoc/capi.rst 及其对应的 qiskit/capi/init.py 模块为核心系统讲解 Qiskit 公开 C API 在 Python 空间中的访问方式如何通过get_include()/get_lib()获取头文件与共享库路径、如何利用模块内完整导出的ctypes绑定直接调用 C API 函数、以及这些绑定背后的头文件生成与测试验证机制。读完本文你将掌握在 Python 程序中定位 Qiskit C 头文件、加载共享库并通过ctypes与Qk*符号交互的完整实战方案。一、capi.rst 到底是什么一份由 autodoc 驱动的 API 文档仓库中的docs/apidoc/capi.rst全文只有 7 行核心是一条 Sphinx autodoc 指令.. _qiskit-capi: .. automodule:: qiskit.capi :no-members: :no-inherited-members: :no-special-members:它的作用是把 qiskit/capi/init.py 模块的模块级 docstring渲染为独立文档页面。因此这份文档的真实技术骨架是qiskit.capi模块自身——所有关于 C API Python 接口的说明、函数签名与使用注意事项都来自该模块的文档字符串与实现。下面我们以模块源码为主线展开。二、qiskit.capi 模块定位Python 与 Qiskit C API 的桥接层从 qiskit/capi/init.py 的文档字符串可以确认模块的定位This module provides Python-space interactions with Qiskits public C API.也就是说qiskit.capi是一个纯 Python 层的桥接模块负责把 Qiskit 用 Rust 实现并经由 C ABI 暴露出来的公共接口即Qk*前缀符号体系以两种形态提供给 Python 用户构建期接口get_include()与get_lib()两个函数用于定位头文件目录与共享库文件运行期接口模块根上直接导出的、与 C API 同名的ctypes绑定函数、结构体、枚举以及模块属性LIB。模块的导入逻辑也印证了这一点from . import _ctypes from ._ctypes import * import qiskit._accelerate __all__ [get_include, get_lib] __all__ _ctypes.__all__qiskit.capi的所有ctypes绑定都来自内部的_ctypes子模块按源码结构推断并连同两个定位函数一起构成模块的公开 API。同时__all__的写法保证了from qiskit.capi import *能拿到全部绑定符号。三、构建期接口get_include 与 get_lib3.1 get_include()获取 C 头文件目录def get_include() - str: return str(Path(__file__).parent.absolute() / include)返回值一个绝对路径指向包含qiskit.h主头文件以及内部qiskit/*.h辅助头文件的目录。使用场景把 Qiskit 作为 C 扩展的构建依赖时需要把这个目录加入编译器的 include 搜索路径。关键约束该目录在 Qiskit 包数据中的位置“不固定可能在版本间变化”所以官方明确要求“永远通过该函数获取”不要硬编码路径。模块文档字符串中给出了一个可直接复制的编译示例qiskit_include$(python -c import qiskit.capi; print(qiskit.capi.get_include())) gcc -I $qiskit_include my_bin.c -o my_bin3.2 get_lib()获取包含全部 C API 导出符号的共享库def get_lib() - str: return str(Path(qiskit._accelerate.__file__).absolute())返回值包含全部 C API 导出符号的共享对象库的绝对路径。从实现看这个库就是qiskit._accelerate扩展模块对应的动态库文件。使用场景需要直接用ctypes访问其中 C API 符号时。安全警告文档原文强调通常不应直接链接该库特别是“直接链接它并不是构建可分发 Python 扩展模块的安全方式”只有当开发者完全理解直接链接的全部注意事项时才应使用该函数获取库位置。另一个注意点C API 头文件中声明的类型与 Python 侧对应的对象不可互换即使通过ctypes拿到了符号也要小心处理。仓库中的测试 test/python/capi/test_capi.py 对这两个函数做了直接验证def test_includes_exists(self): path Path(capi.get_include()) self.assertIn(QISKIT_H, (path / qiskit.h).read_text(encodingutf-8)) self.assertLess(set(), set((path / qiskit).glob(*.h))) def test_library_exists(self): self.assertTrue(Path(capi.get_lib()).exists())测试确认了两件事get_include()返回的目录下必须存在包含QISKIT_H宏的qiskit.h与若干qiskit/*.h头文件get_lib()返回的库文件必须真实存在。这也是判断当前环境 C API 是否完整安装的最快方法。四、运行期接口ctypes 原生绑定除定位函数外qiskit.capi还包含到所有 Qiskit C API 类型与函数的ctypes绑定作为模块属性以与 C API 相同的名字暴露。模块文档给出的对应关系示例qiskit.capi.qk_circuit_new对应 C API 中的qk_circuit_new。4.1 LIB 属性底层库的 ctypes 句柄LIB: ctypes.PyDLLLIB是共享库包含 Qiskit C API的ctypes.PyDLL包装器。文档强调它“为完整性而提供”因为所有函数、结构体与枚举都可以直接从qiskit.capi模块对象上访问一般不需要直接操作LIB。4.2 结构体Structs的绑定规则具体结构体C API 中的具体struct类型被声明为对应的ctypes.Structure类型且带有完整的_fields_属性可以直接实例化并检查。不透明指针用没有设置_fields_的ctypes.Structure表示不能实例化通常以ctypes.POINTER包装形式从函数中返回。测试 test/python/capi/test_circuit.py 演示了具体结构体的实际用法——通过输出参数接收指令视图view capi.QkCircuitInstruction() capi.qk_circuit_get_instruction(c_circ, c_idx, ctypes.byref(view)) param view.params[0]这里QkCircuitInstruction就是可实例化的具体结构体作为qk_circuit_get_instruction的输出缓冲区传入随后直接读取其params字段。4.3 枚举Enums的绑定规则C API 中有枚举的地方模块声明为值类型是对应ctypes原始整数类型的 Pythonenum.Enum。关键行为ctypes函数返回枚举时返回的是原始数值而不是Enum成员Python 空间的Enum对象是“为了便于构造调用”而声明的。test_circuit.py正是利用了这一规则来比较参数种类param_kind capi.qk_param_kind(param) self.assertEqual(param_kind, expected_param_types[idx]) # expected_param_types 中存放的是 QkParamKind.Int.value.value 等原始整数值因为qk_param_kind返回的是原始整数测试用QkParamKind.Int.value.value取枚举成员对应的数值进行比较。4.4 函数Functions的绑定规则所有 C API 公共库函数都是“完全类型化”的并以与 C 相同的名字在模块根上再导出。也可以从LIB上访问这些函数。例外纯头文件函数header-only functions例如qk_import因为不属于 C API 库对象不会被导出。五、头文件从哪来bindgen crate 的生成管线qiskit.capi分发的头文件并非凭空存在它们由 Rust 侧的 crates/bindgen/src/lib.rs 生成并安装。该 crate 的核心逻辑从源码结构可确认使用cbindgen从qiskit-cext公共 API crate包括qiskit-quantum-info、qiskit-circuit、qiskit-transpiler生成 C 绑定通过EXPORT_PREFIX Qk给所有导出符号加前缀并维护一张EXPORT_RENAME表把 Rust 内部类型名映射为公开的 C 名称例如DAGCircuit → QkDag、CircuitData → QkCircuit、SparseObservable → QkObs、StandardGate → QkGate等把生成结果拆分为types.h类型与常量和funcs.h函数两个文件连同手写的attributes.h、complex.h、version.h一起安装到 include 目录支持python_bindingfeature 与QISKIT_C_PYTHON_INTERFACE宏之间的映射以及通过Qk_DEPRECATED_FN/Qk_DEPRECATED_FN_NOTE宏标记废弃函数见 crates/bindgen/include/qiskit/attributes.h。主头文件 crates/bindgen/include/qiskit.h 的结构清晰展示了分发内容的组织方式#include qiskit/attributes.h #include qiskit/complex.h #include qiskit/version.h #include qiskit/types.h // Generated by cbindgen. #if defined(QISKIT_PYTHON_EXTENSION) #include qiskit/funcs_py.h // Generated by Qiskits pyext #else #include qiskit/funcs.h // Generated by cbindgen. #endif其中QISKIT_PYTHON_EXTENSION宏会额外引入Python.h用于构建 Python 扩展的专用场景普通 C 程序则走纯 C 分支。版本宏定义在 crates/bindgen/include/qiskit/version.h例如QISKIT_VERSION_MAJOR/MINOR/PATCH、QISKIT_VERSION_HEX格式0xMMmmppls如2.1.0rc1即0x020100C1当前仓库该文件标注的开发版本为2.6.0-dev。六、实战用 qiskit.capi 从 Python 调用 C 级转译仓库测试目录 test/python/capi 提供了最完整的实战范例展示了“构造 Target → 借出电路 → 调用 C 转译 → 收回结果”的完整调用链。第一步构造 C 级 Target见 test/python/capi/ffi.py。利用ctypes绑定逐条添加指令属性c_target capi.qk_target_new(cmap.size()) entry capi.qk_target_entry_new(int(gate_obj._standard_gate)) # 为每条边/每个量子比特添加时长与错误率属性 capi.qk_target_entry_add_property(entry, qubits, 2, duration, error) capi.qk_target_add_instruction(c_target, entry) measure_entry capi.qk_target_entry_new_measure() capi.qk_target_add_instruction(c_target, measure_entry)这里可以看到qk_target_new、qk_target_entry_new、qk_target_entry_add_property、qk_target_add_instruction等函数如何协同工作返回的ctypes.POINTER(capi.QkTarget)即不透明指针的典型用法。第二步调用转译函数。ffi.py中的transpile_from_c展示了结构体作为输入输出参数、以及错误码检查的完整模式options capi.QkTranspileOptions(*args) # 输入结构体优化等级、seed、近似度 result capi.QkTranspileResult(None, None) # 输出结构体 error ctypes.pointer(ctypes.c_char()) # 错误缓冲区 res capi.qk_transpile( capi.qk_circuit_borrow_from_python(circuit._data), # 从 Python 电路借出 C 视图 target, ctypes.byref(options), ctypes.byref(result), ctypes.byref(error), ) if res ! 0: raise TranspilerError(fTranspilation failed: {error.contents.value.decode(utf8)})第三步收回 Python 对象并管理内存layout capi.qk_transpile_layout_to_python(result.layout, result.circuit) capi.qk_transpile_layout_free(result.layout) # 显式释放 C 侧资源 out capi.qk_circuit_to_python_full(result.circuit) out._layout layout值得注意的细节qk_circuit_borrow_from_python提供的是“借出”视图对应test_circuit.py中对含多种延迟单位dt/ms/ns与Parameter电路的参数种类检查QkParamKind.Int/Real/ParameterExpression凡是*_new创建的对象都要用对应的*_free显式释放测试中self.addCleanup(capi.qk_target_free, target)test_transpile.py中test_transpile_qft_grid等用例以 4 个优化等级0–3跑完整转译管线并断言结果电路中的CXGate全部落在耦合映射边上证明了 C API 转译在功能上与 Python 层一致。七、使用约束与最佳实践小结永远调用get_include()/get_lib()定位资源不要硬编码路径因为包内布局可能随版本变化qiskit/capi/init.py。不要直接链接get_lib()的输出来构建可分发扩展仅在完全理解风险时用它定位库文件。C 类型与 Python 对象不可互换通过ctypes操作 C API 时对象生命周期、内存释放*_free系列都要显式管理。枚举返回的是原始整数构造调用时才使用Enum成员qk_import这类纯头文件函数不在库中无法从LIB访问。头文件体系由 crates/bindgen/src/lib.rs 的 cbindgen 管线生成并随 Python 包分发符号统一使用Qk前缀带Qk_DEPRECATED_FN标记的为废弃接口。若需验证当前环境 C API 完整性可直接运行仓库测试 test/python/capi/test_capi.py 中的test_includes_exists与test_library_exists。参考资源API 文档入口docs/apidoc/capi.rst模块实现与全部文档字符串qiskit/capi/init.py头文件生成管线crates/bindgen/src/lib.rs分发的头文件crates/bindgen/include/qiskit.h、crates/bindgen/include/qiskit/version.h、crates/bindgen/include/qiskit/attributes.h测试用例test/python/capi/test_capi.py、test/python/capi/test_circuit.py、test/python/capi/test_transpile.py、test/python/capi/ffi.py赞分享科学计算【免费下载链接】qiskitQiskit is an open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.项目地址https://gitcode.com/gh_mirrors/qi/qiskit点击查看免费下载相关推荐qiskit-bindgen 深度解析Qiskit C API 头文件自动生成、安装与 Rust/Python FFI 绑定管线qiskit bindgen 深度解析Qiskit C API 头文件自动生成、安装与 Rust/Python FFI 绑定管线 qiskit bindgen科学计算OpenCV Python 绑定生成机制深度解析从 C 头文件到 cv2 模块OpenCV Python 绑定生成机制深度解析从 C 头文件到 cv2 模块 本文围绕 OpenCV 官方教程 OpenCV Python Bindin计算机视觉图像处理深度学习机器学习Qiskit C API 绑定 crate qiskit-cext 全解析从构建、头文件生成到 C 程序调用Qiskit C API 绑定 crate qiskit cext 全解析从构建、头文件生成到 C 程序调用 qiskit cext 是 Qiskit 仓库中科学计算创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考