Комбинированный модуль расширения Python & Ruby - PullRequest
7 голосов
/ 04 февраля 2009

У меня есть модуль расширения C для Python, и я хочу сделать его доступным для Rubyists.

Источник имеет несколько модулей на Си, только один из которых зависит от Python. Остальные зависят только друг от друга и от стандартной библиотеки. Я могу построить его с python setup.py build обычным способом.

Я экспериментировал с добавлением поддержки Ruby с использованием newgem и могу создать версию расширения с rake gem. Тем не менее, объединенный источник имеет некрасивую структуру каталогов (смешивая структуры в стиле Gem и в стиле Setuptools), и процесс сборки представляет собой сложный процесс.

Я не могу просто хранить все исходники в одном каталоге, потому что mkmf автоматически выбирает Python-зависимый модуль и пытается его построить, и пользователям не нужно устанавливать Python для компиляции модуля, который победил ' не будет использоваться. Мой текущий взлом для extconf.rb, чтобы скопировать Python-независимые исходные файлы в тот же каталог, что и Ruby-зависимый модуль расширения.

Есть ли более разумный способ сделать код доступным для обоих языков? Должен ли я просто дублировать Python-независимый код в отдельный Gem? Должен ли я выпустить независимый код в виде отдельной библиотеки, созданной с помощью autotools? Есть ли версия mkmf, которая может пропустить ненужный модуль?

Ответы [ 2 ]

5 голосов
/ 04 февраля 2009

Один из способов ее решения - создать три разных проекта:

  • Сама библиотека, независимая от python & ruby ​​
  • Привязки Python
  • Рубиновые привязки

Это, пожалуй, самое чистое решение, хотя оно требует немного больше работы при работе с релизами, но имеет то преимущество, что вы можете выпускать новую версию привязок Ruby без необходимости поставлять новую версию привязок библиотеки / python.

0 голосов
/ 05 февраля 2009

В дополнение к тому, что сказал Йохан, я использовал пару библиотек поддержки c / c ++ в Python благодаря swig. Вы пишете свой код на языке c / c ++, а затем создаете промежуточный шаблон для каждого языка, который хотите поддерживать. Это довольно безболезненно для Python, но для Ruby должны быть сделаны некоторые соображения ... а именно, я не думаю, что поддержка pthread заключается в том, чтобы довольствоваться ruby ​​или наоборот.

http://www.swig.org/ У него довольно крутая кривая обучения, поэтому может быть лучше найти пример проекта, который демонстрирует, как использовать оболочку для ваших целевых языков.

Это, безусловно, полезный инструмент, поскольку он делает ваш код намного чище, при этом обеспечивая надежные привязки к нескольким языкам (PHP, Python, Ruby и, я полагаю, c #)

...