簡體   English   中英

如何在Python中實現一個C接口並使用CFFI傳遞對象

[英]How to implement a C interface in Python and pass objects using CFFI

我想知道如何使用現有的 C 接口(header 文件)並通過使用 CFFI 庫在 Python 中實現這樣的接口。

例如,我有以下 header 文件interface.h

void* foo(void* value);

我想在 Python 中實現它。 我認為以下程序可以完成工作,但事實並非如此。 它創建 function foo ,但不保證實現遵循 header 文件中定義的結構。

import cffi

ffibuilder = cffi.FFI()

with open('interface.h') as f:
    data = ''.join([line for line in f if not line.startswith('#')])
    ffibuilder.embedding_api(data)

ffibuilder.set_source("_lib", r'''
    #include "interface.h"
''')

ffibuilder.embedding_init_code("""
    from _lib import ffi

     #include "interface.h"

    @ffi.def_extern()
    def foo(param):
        return __import__(param)

""")

ffibuilder.compile(verbose=True)

如何使用 CFFI 傳遞 Python 對象?

在上面的例子中,作為調用foo的結果,返回 Python object。 然后在客戶端,我有以下內容:

ffi = FFI()
# Load my lib file
lib = C.CDLL(dll)

h = lib.foo("math")

當我查看 h 的值時,它顯示了一個類型為 integer 的數字。 但是,我期待收到 object。 根據接口, foo必須返回一個指針void* 我如何從中讀取 object ? 難道我做錯了什么?

要回答您的最后一個問題:在此示例中,您使用的是ctypes ,而不是cffi 這些是不同的項目。 這應該很明顯,因為ffi object 來自cffi ,但在以下行中未使用。 而不是lib = C.CDLL()我猜Cctypes的別名,你應該調用lib = ffi.dlopen("...")

我發現問題在於從 ctypes 切換到 CFFI 以加載 DLL 時。 第一個需要定義動態庫中可用的方法。 因此,添加這個可以解決問題

ffi.cdef("""
  void foo(void* value);
""")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM