使用CFFI使用struct测试C代码时的Typeerror

时间:2017-08-19 01:08:10

标签: c python-cffi

我正在进行cffi测试演示,当我尝试运行python测试器文件时,它会返回以下错误:TypeError:ctype的初始化程序' Car *'似乎确实是'Car *',但类型不同(请检查您是不是混合了不同的ffi实例)

car.h文件定义了C结构Car,如下所示:

/*Class definition for car*/
     typedef struct {
     char make[32];
     char model[32];
     char year[32];
     char color[32];
     } Car;

这是使用cffi的python文件,我试图用来测试C代码。

import unittest
import cffi
import importlib

ffi=cffi.FFI()
def load(filename):
    #load source code
    source = open('../src/' + filename + '.c').read()
    includes = open('../include/' + filename + '.h').read()

    #pass source code to CFFI
    ffi.cdef(includes)
    ffi.set_source(filename + '_', source)
    ffi.compile()

    #import and return resulting module
    module = importlib.import_module(filename + '_')
    return module.lib

class carTest(unittest.TestCase):
    def test_setMake(self):
        module = load('car')

        myCar = ffi.new('Car *',
           ["Honda", "Civic", "1996", "Black"])
        make = ("char []", "Honda")

        self.assertEqual(module.setMake(myCar, make),
                car)

if __name__ == '__main__':
    unittest.main()

对此问题的任何建议都会非常受欢迎。我觉得我已经过了一百次了。

提前致谢

1 个答案:

答案 0 :(得分:0)

这是因为你混合了两个不相关的ffi实例。您可以在load()函数中明确创建和使用的那个来创建C扩展模块;在这种用法中,我们建议将其称为ffibuilder而不是ffi。但是,您导入已编译的模块,并获得另一个ffi实例module.ffi;那个来自C扩展模块。理想情况下,编译后不应再使用ffibuilder

我建议更改load()以同时返回module.ffimodule.lib(或者只是module),终止全局ffi声明,然后制作在ffibuilder = cffi.FFI()函数中本地load()