2009-02-04 1 views
7

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

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

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

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

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

ответ

5

Один из способов решить эту проблему заключается в создании трех различных проектов:

  • сама библиотека, не зависит от питона & рубинового
  • Python привязок
  • Рубин привязок

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

0

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

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

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

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