LINUX.ORG.RU

История изменений

Исправление 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 упаковать данные в строку отвечающую сишной структуре (если знаете как она устроена) и отдать сишной функции которая просто возьмет содержимое строки и кастанет указатель на него к нужному типу. Букв меньше, но нужно знать как все уложено в структуре.