История изменений
Исправление
AntonI,
(текущая версия)
:
У меня под SWIG 3.08 типы полей структуры size_t и unsigned long long работают из коробки (кастуются к питоновскому long).
Но чисто для общего развития, а можно ли вручную создать такой extension без использования swig?
Можно, но это гемор. Хотя кроме SWIG есть еще какие то системы биндинга, я их не помню. SWIG хорош когда нужно малой кровью забиндить много сишного кода, или когда сишный код меняется а че то в прокладке адаптировать руками лень. Если кода мало и есть много каких то экзотических ситуаций - да, возможно вместо SWIG лучше взять что то другое. Но я пока не уверен что это Ваш случай…
Т.е. чтобы на стороне питона операции шли исключительно с объектами? Когда память под структуру инициализируется в конструкторе питоньего объекта, а фукнции можно передать объект, и она корректно возьмёт из его внутренностей структуру?
Есть две крайности - можно как Вы написали собрать в питоне объект (питоний) и отдать его сишной функции, которая через PyAPI его разберет. Это потребует много букв, PyAPI очень многословен, кроме того может потечь память (как @Serral и @dave выше писали).
Можно на стороне питона через struct упаковать данные в строку отвечающую сишной структуре (если знаете как она устроена) и отдать сишной функции которая просто возьмет содержимое строки и кастанет указатель на него к нужному типу. Букв меньше, но нужно знать как все уложено в структуре.
Исправление
AntonI,
:
У меня под SWIG 3.08 типы полей структуры size_t и unsigned long long работают из коробки (кастуются к питоновскому long).
Но чисто для общего развития, а можно ли вручную создать такой extension без использования swig?
Можно, но это гемор. Хотя кроме SWIG есть еще какие то системы биндинга, я их не помню. SWIG хорош когда нужно малой кровью забиндить много сишного кода, или когда сишный код меняется а че то в прокладке адаптировать руками лень. Если кода мало и есть много каких то экзотических ситуаций - да, возможно вместо SWIG лучше взять что то другое. Но я пока не уверен что это Ваш случай…
Т.е. чтобы на стороне питона операции шли исключительно с объектами? Когда память под структуру инициализируется в конструкторе питоньего объекта, а фукнции можно передать объект, и она корректно возьмёт из его внутренностей структуру?
Есть две крайности - можно как Вы написали собрать в питоне объект (питоний) и отдать его сишной функции, которая через PyAPI его разберет. Это потребует много букв, PyAPI очень многословен, кроме того может потечь память (как @Serral выше писал).
Можно на стороне питона через struct упаковать данные в строку отвечающую сишной структуре (если знаете как она устроена) и отдать сишной функции которая просто возьмет содержимое строки и кастанет указатель на него к нужному типу. Букв меньше, но нужно знать как все уложено в структуре.
Исходная версия
AntonI,
:
У меня под SWIG 3.08 типы полей структуры size_t и unsigned long long работают из коробки (кастуются к питоновскому long).
Но чисто для общего развития, а можно ли вручную создать такой extension без использования swig?
Можно, но это гемор. Хотя кроме SWIG есть еще какие то системы биндинга, я их не помню. SWIG хорош когда нужно малой кровью забиндить много сишного кода, или когда сишный код меняется а че то в прокладке адаптировать руками лень. Если кода мало и есть много каких то экзотических ситуаций - да, со SWIG-ом придется повозиться. Но я пока не уверен что это Ваш случай…
Т.е. чтобы на стороне питона операции шли исключительно с объектами? Когда память под структуру инициализируется в конструкторе питоньего объекта, а фукнции можно передать объект, и она корректно возьмёт из его внутренностей структуру?
Есть две крайности - можно как Вы написали собрать в питоне объект (питоний) и отдать его сишной функции, которая через PyAPI его разберет. Это потребует много букв, PyAPI очень многословен, кроме того может потечь память (как @Serral выше писал).
Можно на стороне питона через struct упаковать данные в строку отвечающую сишной структуре (если знаете как она устроена) и отдать сишной функции которая просто возьмет содержимое строки и кастанет указатель на него к нужному типу. Букв меньше, но нужно знать как все уложено в структуре.