Как вызвать структуру с CFFI - PullRequest
1 голос
/ 23 мая 2019

Я использую файл python для вызова структуры C ++, уже переведенной через cffi. В настоящее время я получаю ошибки, так как моя структура не вызывается. Как я могу назвать эту структуру правильно? Во-первых, правильно ли я определяю структуру в переводчике cffi?

(simple_cffi_builder.py)

import os
from cffi import FFI

ffibuilder = FFI()

basePath = os.path.dirname(__file__)
filePath = os.path.abspath(os.path.join(basePath, "..", "..", "build/bin/simple_bfs.cpp"))

runtimePath = os.path.abspath(os.path.join(basePath, "..", "..", "src/runtime_lib"))
intrinsicsPath = os.path.abspath(os.path.join(basePath, "..", "..", "src/runtime_lib/intrinsics.h"))

with open(filePath,'r') as f:
    ffibuilder.set_source("_simplebfs_cffi",
                          f.read(),
                          include_dirs=[runtimePath],
                          source_extension = ".cpp",
                          extra_compile_args = ["-std=c++11"]
)

ffibuilder.cdef(
    """
    struct run_bfs{};
    """
)

if __name__ == "__main__":
    ffibuilder.compile(verbose=True)

Структура, которую я пытаюсь вызвать (_simplebfs_cffi.cpp):

struct run_bfs
{
  void operator() () 
  {
 lots of code stuff
  }
}

Код, который я использую для вызова сгенерированного кода C ++ (run_simple_bfs_cffi_python.py):

import os
import _simplebfs_cffi
from cffi import FFI

ffi = FFI()

class run_bfs():
    def __init__(self):
        self.bfs = _simplebfs_cffi.ffi.new("struct run_bfs*", None)

    def __call__(self):
        (self.bfs)()

run_bfs()()

Когда я пытаюсь запустить приведенный выше код, я получаю сообщение об ошибке:

Traceback (последний вызов был последним): файл "run_simple_bfs_cffi_python.py", строка 18, в run_bfs () () Файл "run_simple_bfs_cffi_python.py", строка 15, в call (self.bfs) () TypeError: cdata 'struct run_bfs *' не вызывается

...