【问题标题】:Wrapping C code with python on the fly with CFFI/Cython使用 CFFI/Cython 使用 python 包装 C 代码
【发布时间】:2020-09-13 20:24:49
【问题描述】:

我正在开发一个项目,该项目需要我在 Python 中为我需要从 Python 调用的 C 库创建一些包装器。对于上下文,我使用的 C 库是一堆头文件(.h)和静态链接库文件(.a)

我决定使用 CFFI 或 Cython 来完成我的工作。我对 CFFI - Interfacing C code with CFFI 和 Cython - Making your C library callable from Python by wrapping it with Cython 遵循了类似的示例。现在我在这两个模块中尝试过的小示例程序或多或少都有以下步骤

  • 创建接口代码以调用 C API
    • 在 CFFI 中,它是一个 python 文件,用于声明所需的 C 函数和头文件
    • 在 Cython 中,它是一个 .pyx 文件和对 setup.py 的修改
  • 构建接口代码以生成用于接口胶水代码的.so 文件。
  • 通过从 .so 文件中导入接口库,从不同的 Python 脚本调用封装的函数。

现在,这对我来说非常有效。但是,我必须在这个过程中经历两个执行步骤(生成.so 文件,然后在调用C API 的情况下实际运行python 脚本)。

我需要知道是否有一种方法可以在一个执行步骤中完成上述所有操作。比如,我想运行我的最终 python 脚本,它应该构建接口代码并在一次执行中即时导入它

关于更多上下文,我尝试了 SWIG,但无法找到一种方法来包装 .a 静态链接库。 ctypes 也是如此。

【问题讨论】:

  • 对于 Cython,我认为您正在寻找 pyxinstall。
  • 对不起,你能给我指向一个关于这个的链接吗?
  • Google "pyxinstall",点击第一个链接,找到this answer

标签: python cython swig python-cffi python-bindings


【解决方案1】:

你不能这样做吗?

import os
os.system('command to build your .so here') 
...
import what_ever_you_need
...

【讨论】:

    【解决方案2】:

    对于 CFFI,您只需要在运行时执行构建器脚本中的代码即可。将它全部移动到一个函数中,然后你就有了一个可以在需要时调用的函数。

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2015-08-19
      • 1970-01-01
      相关资源
      最近更新 更多