2009-01-21 4 views
4

J'ai regardé this et ce n'était pas beaucoup d'aide.Comment puis-je prendre la sortie d'un programme et l'utiliser comme l'entrée d'un autre?

J'ai un programme Ruby qui met une question à la ligne cmd et je voudrais écrire un programme Python qui peut retourner une réponse. Est-ce que quelqu'un connaît des liens ou en général comment je pourrais y arriver?

Merci pour votre aide.

EDIT
Merci aux gars qui ont mentionné la tuyauterie. Je ne m'en suis pas trop servi et je suis content qu'il ait été évoqué car il m'a obligé à y regarder de plus près.

+0

Vous pouvez simplement utiliser une langue, mais si vous êtes bloqué sans connaissance de Ruby, pourquoi pas ... – Keltia

Répondre

10
p = subprocess.Popen(['ruby', 'ruby_program.rb'], stdin=subprocess.PIPE, 
              stdout=subprocess.PIPE) 
ruby_question = p.stdout.readline() 
answer = calculate_answer(ruby_question) 
p.stdin.write(answer) 
print p.communicate()[0] # prints further info ruby may show. 

Les 2 dernières lignes pourraient être transformées en un:

print p.communicate(answer)[0] 
+0

C'est bon si vous voulez que le programme python "contrôle". –

+0

@zacherates: qu'est-ce que vous voulez généralement, non? Je suis sûr qu'il y a un moyen de faire la même chose du côté rubis. – nosklo

+0

Ou, encore mieux, p.communiquer (répondre) [0] – habnabit

4

Si vous êtes sur unix/linux vous pouvez utiliser la tuyauterie:

question.rb | answer.py 

Ensuite, la sortie de question.rb devient l'entrée de answer.py

Je n'ai pas essayé récemment, mais j'ai le sentiment que la même syntaxe pourrait fonctionner sur Windows.

+0

-1: cela ne retourne pas la réponse au programme ruby. – nosklo

+1

Hmmm ... Je ne pense pas que l'OP ait demandé au second programme de revenir et de répondre * au programme ruby ​​*. Je suppose que cela dépend de la façon dont vous interprétez "retour". – Ben

3

pexpect

http://www.noah.org/wiki/Pexpect

pexpect est un pur module Expect, comme Python. Pexpect fait de Python un meilleur outil pour contrôler d'autres applications . Pexpect est un module pur Python pour applications enfantes de ponte; les contrôlant; et répondant à des motifs attendus dans leur sortie. Pexpect fonctionne comme l'attente de Don Libes. Pexpect permet à votre script de générer une application enfant et de la contrôler comme si un humain tapait des commandes.

+0

+1: pexpect peut le faire. – nosklo

1

Il y a deux façons (sur le dessus de ma tête) de le faire. Le plus simple si vous êtes dans un environnement Unix est d'utiliser la tuyauterie. Exemple simple:

cat .profile .shrc | more 

Cela envoie la sortie de la première commande (cat .profile .shrc) à la commande more en utilisant le caractère pipe |.

La deuxième méthode consiste à appeler un programme de l'autre dans votre code source. Je ne sais pas comment Ruby gère cela, mais en Python, vous pouvez exécuter un programme et obtenir sa sortie en utilisant la fonction popen. Voir this example chapter from Learning Python, puis Ctrl-F pour "popen" pour un exemple de code.

+0

-1: l'utilisation de tuyaux signifie que les données vont d'une seule façon. Il a spécifiquement demandé de retourner les données – nosklo

+0

C'est une des raisons pour lesquelles j'ai donné deux solutions possibles. –

+0

Bon, retiré vote négatif. – nosklo

3

tout d'abord vérifier cela: [tuyauterie Unix] [1]

Il fonctionne sur Windows ou unix, mais il est slighly dufferent, d'abord les programmes:

question.rb:

puts "This is the question" 

answer.rb:

question = gets 
#calculate answer 
puts "This is the answer" 

Puis la ligne de commande:

En unix:

question.rb | answer.rb 

Dans les fenêtres:

ruby question.rb | ruby answer.rb 

Sortie:

This is the question 
This is the answer 
+0

-1: l'utilisation de tuyaux signifie que les données vont d'une seule façon. Il a spécifiquement demandé de retourner les données – nosklo

+0

Non, ce que je comprends, c'est qu'il a besoin d'obtenir la question d'un autre processus, et c'est comme ça depuis les années 70, votre réponse est plus contrôlée mais presque équivalente à celle-ci . J'ai amélioré les exemples de toute façon. –

+0

@ krusty.ar: Il mentionne en question que le programme python doit en quelque sorte * renvoyer * la réponse au programme ruby. Donc le -1 se tient. – nosklo

Questions connexes