объединение ctypes и swig

#python #swig #ctypes

#python #swig #ctypes

Вопрос:

Я давно использую SWIG — в целом мне это нравится. Но выполнение функций обратного вызова кажется (намного) проще с использованием ctypes.

Как я могу объединить два «способа» взаимодействия с C dll?

Первым шагом было бы узнать, как получить объект ctypes в dll после того, как dll уже загружена с помощью импорта соответствующего модуля SWIG.

Спасибо,
Себастьян.

Ответ №1:

Если x.pyd является скомпилированным модулем расширения swig, то вы можете загрузить dll через ctypes таким образом:

 import x
from ctypes import PyDLL
dll = PyDLL(x.__file__)
 

В зависимости от соглашений о вызовах, используемых экспортируемыми функциями, вам может потребоваться использовать PyDLL, WinDLL или CDLL.

Ответ №2:

Протокол Buffer может быть вашим лучшим выбором ( http://docs.python.org/c-api/buffer.html ).

Из кода C (например, сгенерированного swig-кодом) вы можете получить указатель на базовые данные C, обратившись к этому интерфейсу.

Обратите внимание, что существует две версии интерфейса буфера, объекты ctypes в python 2.x будут предоставлять старый протокол, в python 3.x они предоставляют новый.

Вам придется спуститься до уровня API Python C, но только один раз, если вы все хорошо обернете — например, возможно, создайте встроенную функцию%, возвращающую void* для всего, что поддерживает протокол буфера, и используйте это в typemaps для ваших типов обратного вызова.