2010-09-09 14 views
23

Tengo una biblioteca compilada de Python y documentos de API que me gustaría usar de Ruby.Llamar a Python desde Ruby

¿Es posible cargar una biblioteca de Python, crear instancias de una clase definida en ella y llamar a métodos en ese objeto desde Ruby?

Respuesta

11

This article proporciona algunas técnicas para ejecutar el código Ruby de Python que también debería ser aplicable en sentido inverso (como XML-RPC o pipes), así como técnicas específicas para ejecutar el código Python de Ruby. En particular, rubypython o Ruby/Python parece que pueden hacer lo que quieras.

+0

¿Conoce las comparaciones posibles entre estos 2 ofertas? –

+0

Lamentablemente, no. Tampoco he usado yo mismo. – kindall

+3

Le pregunté al autor de Ruby/Python sobre el proyecto y dijo que es viejo y no está en mantenimiento, por lo que es mejor que te vayas con ruby ​​python. – ThomasW

3

Incluso si puede hacer esto, es posible que desee considerar si esta es la mejor opción arquitectónica. Podrías enfrentarte a todo tipo de infierno de versiones tratando de mantener semejante bestia.

Si realmente no puede encontrar una biblioteca Ruby equivalente (o si desea invertir una gran inversión en Python), considere usar una cola (como RabbitMQ) para implementar un diseño de pase de mensajes. Entonces puedes mantener tus bits Python Python y tus Ruby bits Ruby y no intentar mantener un entorno de construcción Frankenstein.

+0

La biblioteca de Python es una interfaz para una pieza de equipo de prueba comercial, por lo que no tengo la opción de cambiarla o reescribirla en Ruby. –

4

Suena como que se quiere usar algo como Apache Thrift que permite a cualquiera de su pitón o su código de rubí para ser un servidor/cliente y se llaman otro. http://thrift.apache.org/

Puede crear instancias de sus objetos en rubí o en python de acuerdo con su definición de ahorro. Este es un ejemplo del sitio web de ahorro.

struct UserProfile { 
    1: i32 uid, 
    2: string name, 
    3: string blurb 
    } 
    service UserStorage { 
    void store(1: UserProfile user), 
    UserProfile retrieve(1: i32 uid) 
    } 

Básicamente el rubí o pitón será capaz de llamar store() y retrieve() y crear objetos UserProfile etc.

+1

Wow. ¡Esto es genial e ingenioso! Básicamente está terminando tu código y sirviéndolos como una API. ¡Gracias por compartir! – John