сочетая ctypes и swig - PullRequest
       45

сочетая ctypes и swig

3 голосов
/ 25 октября 2011

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

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

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

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

0 голосов
/ 25 октября 2011

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

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

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

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

...