如何获取一个程序的输出并将其用作另一个程序的输入?

时间:2009-01-21 14:01:11

标签: python ruby io

我看过this并没有多大帮助。

我有一个Ruby程序,它向cmd行提出一个问题,我想编写一个可以返回答案的Python程序。有没有人知道任何链接或一般我怎么会这样做?

感谢您的帮助。

编辑
感谢那些提到 pipe 的人。我没有太多地使用它,并且很高兴它被提起,因为它迫使我更多地了解它。

5 个答案:

答案 0 :(得分: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.

最后两行可以合二为一:

print p.communicate(answer)[0]

答案 1 :(得分:4)

如果你在unix / linux上,你可以使用管道:

question.rb | answer.py

然后,question.rb的输出成为answer.py

的输入

我最近没有尝试过,但我觉得同样的语法也适用于Windows。

答案 2 :(得分:3)

Pexpect的

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

  

Pexpect是一种纯粹的Python期望   模块。 Pexpect使Python变得更好   控制其他的工具   应用

     

Pexpect是一个纯Python模块   产卵儿童应用;   控制他们;并回应   预期的产出模式。   Pexpect就像Don Libes的Expect一样。   Pexpect允许你的脚本产生一个   孩子申请并控制它好像   一个人在输入命令。

答案 3 :(得分:3)

首先检查一下: [Unix管道] [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

在Windows中:

ruby question.rb | ruby answer.rb

输出:

This is the question
This is the answer

答案 4 :(得分:1)

有两种方法(在我的头顶)做到这一点。如果您在Unix环境中最简单的方法是使用管道。简单的例子:

cat .profile .shrc | more

这将使用管道符cat .profile .shrc将第一个命令(more)的输出发送到|命令。

第二种方法是在源代码中调用另一个程序。我不知道Ruby如何处理这个问题,但是在Python中你可以运行一个程序并使用popen函数得到它的输出。有关示例代码,请参阅this example chapter from Learning Python,然后按Ctrl-F查看“popen”。