【问题标题】:Typeerror when using CFFI to test C code using struct使用 CFFI 使用 struct 测试 C 代码时出现类型错误
【发布时间】:2018-01-27 17:39:42
【问题描述】:

我正在做一个 cffi 测试演示,当我尝试运行 python 测试器文件时,它返回以下错误:TypeError: initializer for 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;

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

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()

非常欢迎对此问题提出任何建议。我觉得我已经重复了一百次。

提前致谢

【问题讨论】:

  • 这不是minimal reproducible example;提示:尝试仅使用这 2 个片段重现错误 - 不可能。
  • 另外,unittest 的东西完全不相关,然后您可以将 Python 代码压缩成几行。获取一个可以在问题本身中重现问题的工作示例。

标签: c python-cffi


【解决方案1】:

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

我建议将load() 更改为同时返回module.ffimodule.lib(或者可能只是module),终止全局ffi 声明,并在load() 中本地创建ffibuilder = cffi.FFI()功能。

【讨论】:

  • 非常感谢。这就说得通了。我不敢相信我没有看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多