2009-02-04 9 views
7

Tengo un módulo de extensión C para Python y quiero que esté disponible para los Rubyists.Módulo de extensión combinado de Python y Ruby

La fuente tiene varios módulos C, de los cuales solo uno depende de Python. El resto depende solo el uno del otro y la biblioteca estándar. Puedo construirlo con python setup.py build de la manera habitual.

He estado experimentando con la adición de soporte Ruby usando newgem y puedo construir una versión de la extensión con rake gem. Sin embargo, la fuente combinada tiene un diseño de directorio feo (mezcla de estilo Gem y estructuras de estilo de herramientas de configuración) y el proceso de compilación es un kludge.

No puedo mantener todas las fuentes en el mismo directorio porque mkmf toma automáticamente el módulo dependiente de Python e intenta compilarlo, y los usuarios no deberían tener que instalar Python para compilar un módulo que no lo hará ser usado. Mi hack actual es para extconf.rb para copiar los archivos fuente independientes de Python en el mismo directorio que el módulo de extensión dependiente de Ruby.

¿Hay alguna manera más segura de hacer que el código esté disponible para ambos idiomas? ¿Debería simplemente duplicar el código independiente de Python en una Gema separada? ¿Debo liberar el código independiente como una lib independiente construida con autotools? ¿Hay una versión de mkmf que pueda omitir el módulo no deseado?

Respuesta

5

Una forma de resolverlo es crear tres proyectos diferentes:

  • la biblioteca en sí, independiente de pitón & rubí
  • enlaces Python
  • fijaciones
  • Rubí

Esa es probablemente la La solución más limpia, aunque requiere un poco más de trabajo cuando se lanzan, pero tiene la ventaja de que puede lanzar una nueva versión de las vinculaciones de Ruby sin tener que enviar una nueva versión de enlaces de biblioteca/python.

0

Como complemento a lo que dijo Johan, he usado un par de bibliotecas de soporte c/C++ en Python gracias a swig. Usted escribe su código en c/C++ y luego crea una plantilla intermedia para cada idioma que desee. Es bastante sencillo para Python, pero se deben hacer algunas consideraciones para Ruby ... es decir, no creo que el soporte de pthread sea feliz con Ruby o viceversa.

http://www.swig.org/ Tiene una curva de aprendizaje algo empinada, por lo que podría ser mejor encontrar un ejemplo de proyecto que demuestre cómo usar el contenedor para sus idiomas de destino.

Esta es definitivamente una herramienta útil, ya que hace que su código sea mucho más limpio al tiempo que proporciona enlaces robustos a varios idiomas (PHP, Python, Ruby y creo C#)

Cuestiones relacionadas