Как мне взять выходные данные одной программы и использовать их как входные данные другой? - PullRequest
4 голосов
/ 21 января 2009

Я посмотрел на это , и это не сильно помогло.

У меня есть программа на Ruby, которая ставит вопрос в строку cmd, и я хотел бы написать программу на Python, которая может возвращать ответ. Кто-нибудь знает какие-либо ссылки или вообще, как я мог бы сделать это?

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ
Спасибо ребятам, которые упомянули трубопровод . Я не использовал это слишком много и был рад, что это было воспитано, так как это заставило меня тоже посмотреть на него больше.

Ответы [ 5 ]

10 голосов
/ 21 января 2009
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.

Последние 2 строки могут быть объединены в одну:

print p.communicate(answer)[0]
4 голосов
/ 21 января 2009

Если вы работаете в Unix / Linux, вы можете использовать трубопровод:

question.rb | answer.py

Тогда выходные данные question.rb становятся входными данными answer.py

Я недавно не пробовал, но у меня такое чувство, что тот же синтаксис может работать и в Windows.

3 голосов
/ 21 января 2009

Прежде всего, проверьте это: [Unix piping] [1]

Он работает на Windows или Unix, но он слегка изменяет, сначала программы:

question.rb:

puts "This is the question"

answer.rb:

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

Тогда командная строка:

В Unix:

question.rb | answer.rb

В окнах:

ruby question.rb | ruby answer.rb

Выход:

This is the question
This is the answer
3 голосов
/ 21 января 2009

Pexpect

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

Pexpect - это чистый ожидаемый Python модуль. Pexpect делает Python лучше инструмент для управления другими приложения.

Pexpect - это чистый модуль Python для порождение дочерних приложений; контролировать их; и отвечая на ожидаемые закономерности в их выводе. Pexpect работает как Ожидание Дона Либеса. Pexpect позволяет вашему скрипту создавать дочернее приложение и контролировать его, как будто человек печатал команды.

1 голос
/ 21 января 2009

Есть два способа (вне головы) сделать это. Самое простое, если вы находитесь в среде Unix, - это использовать трубопровод. Простой пример:

cat .profile .shrc | more

Это отправит вывод первой команды (cat .profile .shrc) в команду more, используя символ канала |.

Второй способ - вызвать одну программу из другой в вашем исходном коде. Я не знаю, как Ruby справляется с этим, но в Python вы можете запустить программу и получить ее вывод с помощью функции popen. См. этот пример главы из Learning Python , затем Ctrl-F для «popen» для некоторого примера кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...