2012-10-07 2 views
7

У меня плохо спроектированный и большой (> 300 public functions, >200 numeric constants, определенный в файле заголовка #define), который я должен обернуть в Python. У меня есть dll и файл h. Библиотека обновляется ежегодно, до сих пор обратно совместимым способом (т. Е. Были добавлены только функции, константа сохраняла их числовые значения и т. Д.). Но у меня нет никаких гарантий, поскольку я не контролирую библиотеку.Поддержание работоспособности упаковки python библиотеки C

Использование ctypes, я вижу два способа оборачивать это в Python:

  1. Mapping каждую постоянную и функцию питона, 1 к 1
  2. Переосмысление API в Python и делать звонки в библиотеку ,

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

Я был бы признателен за некоторые мнения, основанные на вашем опыте с этим типом проблемы и некоторыми примерами.

+0

Извините, но так хорошо, что это не совсем ясный вопрос. –

+3

Взгляните на SWIG. –

+0

[SIP] (http://pypi.python.org/pypi/SIP/4.14) может быть интересным решением. –

ответ

4

Недавно я использовал ctypesgen для создания обложек ctypes для SDL и дополнительных библиотек (SDL_image, SDL_ttf, SDL_mixer).

Для меня это работало достаточно хорошо. Он генерирует Python 2.x, но мне удалось получить нужный код 3.x с помощью утилиты «2to3».

Я думаю, что это хорошая идея использовать обертывание ctypes как основу для более «pythonic» api, и это в основном то, что я сделал (на очень простом уровне) с моим модулем pslab.

Итак, если вы хотите сделать что-то подобное, это будет один из способов.

0

Поддержание библиотеки Python с использованием ctypes-бэкэнд не является неуправляемым. Очевидно, что первоначальные инвестиции больше, чем использование автоматизированных инструментов, но API, который вам оставил, должен быть намного лучше.

Если вы делаете этот маршрут, попытайтесь полностью отделить Python API от библиотеки C. Поддержка нескольких ctypes-бэкендов одним Python-интерфейсом api не так уж плоха - просто запрос во время выполнения и динамическая загрузка правильного модуля обертки ctypes. Я сделал это, чтобы обернуть различные файлы dll и .so файлы для окон и linux, но он будет работать и для версий библиотеки.

Смежные вопросы