#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 для ваших типов обратного вызова.