2009-05-07 10 views
5

¿Existe un puente Ruby to Python fácil de usar? ¿O es mejor que use el sistema()?¿Cómo invoco el código Python de Ruby?

+0

hice una pregunta similar aquí anteriormente; quizás las respuestas serían de alguna ayuda: http://stackoverflow.com/questions/2413878/would-it-be-possible-to-integrate-python-or-perl-with-ruby. – Yktula

Respuesta

2

No creo que haya ninguna manera de invocar Python desde Ruby sin bifurcar un proceso, a través del sistema() o algo así. Los tiempos de ejecución del lenguaje son completamente diferentes, de todos modos necesitarían estar en procesos separados.

+0

invocar procesos a través del módulo de subproceso. sistema() carece de mucho, vamos a matar a la bestia. – nosklo

6

Puede intentar Masaki Fukushima's library para incrustar python en ruby, aunque no parece mantenerse. YMMV

Con esta biblioteca, las secuencias de comandos de Ruby pueden llamar directamente a los módulos arbitrarios de Python. Se pueden usar módulos de extensión y módulos escritos en Python.

El divertidamente nombrado Unholy de la ingeniosa Por qué el Lucky Stiff también podría ser de utilidad:

Compilar Ruby a Python bytecode.
Y, además, traducir que
bytecode de nuevo a Python código fuente usando Decompyle (incluidos.)

Requiere Ruby 1.9 y Python 2.5.

+0

Agradable. No había oído hablar de profano antes. –

-1

Para que el código python se ejecute, el intérprete debe iniciarse como un proceso. Entonces el sistema() es tu mejor opción.

Para llamar al código python puede usar RPC o sockets de red, por la cosa más simple que podría funcionar.

+0

Genial, eso es lo que pretendo hacer. No veo ningún motivo para ser más elegante que usar el sistema() solo. – Eric

+2

No creo que sea cierto en absoluto: consulte http://docs.python.org/extending/embedding.html para ver la documentación de incrustación del intérprete de Python en otra aplicación. Lo cual, para el perverso, podría ser el intérprete de Ruby. –

0

Si desea utilizar el código Python como su secuencia de comandos de Python es una función, tratar IO.popen.

Si desea invertir cada cadena en una matriz utilizando la secuencia de comandos python "reverse.py", su código ruby ​​sería el siguiente.

strings = ["hello", "my", "name", "is", "jimmy"] 
#IO.popen: 1st arg is exactly what you would type into the command line to execute your python script. 
#(You can do this for non-python scripts as well.) 
pythonPortal = IO.popen("python reverse.py", "w+") 
pythonPortal.puts strings #anything you puts will be available to your python script from stdin 
pythonPortal.close_write 

reversed = [] 
temp = pythonPortal.gets #everything your python script writes to stdout (usually using 'print') will be available using gets 
while temp!= nil 
    reversed<<temp 
    temp = pythonPortal.gets 
end 

puts reversed 

A continuación, la secuencia de comandos de Python se vería algo como esto

import sys 

def reverse(str): 
    return str[::-1] 

temp = sys.stdin.readlines() #Everything your ruby programs "puts" is available to python through stdin 
for item in temp: 
    print reverse(item[:-1]) #Everything your python script "prints" to stdout is available to the ruby script through .gets 
    #[:-1] to not include the newline at the end, puts "hello" passes "hello\n" to the python script 

Salida: olleh ym eman si ymmij

+2

El autor está buscando invocar el código python de ruby, no el código ruby ​​de python. –

Cuestiones relacionadas