Компиляция нескольких исходных файлов с помощью cffi - PullRequest
1 голос
/ 04 мая 2019

Недавно я обнаружил модуль cffi Python, и я хотел бы использовать его для написания модульных тестов для некоторого кода C, который я написал на Python.Одна (возможно, простая) вещь, которую я не могу обернуть, это то, как скомпилировать несколько исходных файлов C в один модуль Python, который затем может быть импортирован кодом Python.

Скажем, например, у меня есть четыре файла C, a.c, a.h, b.c и b.h, так что a.c включает в себя a.h и b.h и вызывает функции, реализованные в b.cb.c включает только b.h.

Если бы я хотел написать модульные тесты для функций, реализованных в b.c, я мог бы просто сделать это:

import cffi

with open('b.h', 'r') as f:
    b_h = f.read()

with open('b.c', 'r') as f:
    b_c = f.read()

ffi = cffi.FFI()

ffi.cdef(b_h)
ffi.set_source('_b', b_c)

# import _b ...

Но что, если я захочунаписать модульные тесты для функций, определенных в a.c?

1 Ответ

1 голос
/ 04 мая 2019

Основная идея заключается в использовании:

ffi.set_source("_mytest", '''
    #include "a.h"
''', sources=["a.c", "b.c"])

для компиляции модуля, содержащего a.c и b.c и включающего a.h, который сам включает b.h. При этом используется аргумент distutils sources=[..], чтобы предоставить дополнительные исходные файлы для компиляции в тот же модуль расширения. Выше этой строки вы можете использовать ffi.cdef() в объявлениях C, которые вас интересуют - обычно это подмножество a.h и b.h. (Вы можете вызывать ffi.cdef() более одного раза или только один раз для строки, составленной путем объединения нескольких частей.)

...