2009-05-07 9 views
5

Existe-t-il un pont Ruby to Python facile à utiliser? Ou suis-je mieux d'utiliser system()?Comment appeler du code Python depuis Ruby?

+0

j'ai posé une question similaire ici plus tôt; peut-être que les réponses seraient utiles: http://stackoverflow.com/questions/2413878/would-it-be-possible-to-integrate-python-or-perl-with-ruby. – Yktula

Répondre

2

Je ne pense pas qu'il y ait moyen d'invoquer Python à partir de Ruby sans forcer un processus, via system() ou quelque chose comme ça. Les temps d'exécution de la langue sont complètement différents, ils devraient être dans des processus séparés de toute façon.

+0

appelle les processus via le module de sous-processus. système() manque beaucoup, tuons la bête. – nosklo

6

Vous pouvez essayer Masaki Fukushima's library pour incorporer python dans ruby, bien qu'il ne semble pas être maintenu. YMMV

Avec cette bibliothèque, les scripts Ruby peuvent appeler directement des modules Python arbitraires. Les modules d'extension et les modules écrits en Python peuvent être utilisés.

Le plaisamment nommé Unholy de l'ingénieux Pourquoi le Lucky Stiff pourrait aussi être utile:

Compile Ruby à Python bytecode.
Et, en outre, que traduire
bytecode retour au code source Python à l'aide Decompyle (inclus).

Ruby 1.9 et Exige Python 2.5.

+0

Nice. N'avait pas entendu parler d'impie avant. –

-1

Pour que le code Python s'exécute, l'interpréteur doit être lancé en tant que processus. Donc, system() est votre meilleure option. Pour appeler le code python, vous pouvez utiliser des sockets RPC ou réseau, pour la chose la plus simple qui pourrait éventuellement fonctionner.

+0

Super, c'est ce que j'ai l'intention de faire. Ne voyez pas de raison d'être plus chic que d'utiliser system() seul. – Eric

+2

Je ne pense pas que ce soit vrai du tout: voir http://docs.python.org/extending/embedding.html pour la documentation de l'intégration de l'interpréteur Python dans une autre application. Ce qui, pour le pervers, pourrait être l'interprète Ruby. –

0

Si vous voulez utiliser le code Python comme votre script Python est une fonction, essayez IO.popen.

Si vous vouliez inverser chaque chaîne d'un tableau en utilisant le script python "reverse.py", votre code ruby ​​serait le suivant.

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 

Ensuite, votre script python ressemblerait à quelque chose comme ça

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 

Sortie: olleh YM iman si ymmij

+2

L'auteur cherche à invoquer le code python de ruby, pas le code ruby ​​de python. –

Questions connexes