Как мне эмулировать динамическую структуру C в Python, используя ctypes - PullRequest
3 голосов
/ 04 августа 2010

Я пишу некоторый код на Python для взаимодействия с C DLL, который широко использует структуры.

Одна из этих структур содержит вложенные структуры.Я знаю, что это не проблема для модуля ctypes.Проблема в том, что есть часто используемая структура, которая в Си определяется с помощью макроса, потому что она содержит «статический» массив длины, который может меняться.Это сбивает с толку, так что вот некоторый код

struct VarHdr {
    int size;
}

#define VAR(size) \
    struct Var {
        VarHdr hdr;
        unsigned char Array[(size)];
    }

Затем он используется в других структурах, подобных этой

struct MySruct {
    int foo;
    VAR(20) stuffArray;
}

Тогда возникает вопрос, как я могу эмулировать это в Python таким образом,Полученная структура может передаваться взад-вперед между моим скриптом pythong и DLL.

Кстати, я знаю, что могу просто жестко закодировать число там, но есть несколько экземпляров этого "VAR" повсюду, которые имеют разные размеры.

1 Ответ

6 голосов
/ 04 августа 2010

Просто используйте фабрику, чтобы определить структуру, как только размер станет известен.

http://docs.python.org/library/ctypes.html#variable-sized-data-types:

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

(не проверено) Пример:

def define_var_hdr(size):
   class Var(Structure):
       fields = [("size", c_int),
                 ("Array", c_ubyte * size)]

   return Var

var_class_10 = define_var_hdr(10)
var_class_20 = define_var_hdr(20)
var_instance_10 = var_class_10()
var_instance_20 = var_class_20()
...