2009-01-21 25 views
4

我看过this,这没什么帮助。如何获取一个程序的输出并将其用作另一个程序的输入?

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

感谢您的帮助。

编辑
多亏了提到管道的家伙。我没有太用它,很高兴它被提出来,因为它迫使我也更加注意它。

+0

你可以只使用一种语言,但如果你坚持不知道Ruby知识,为什么不... – Keltia 2009-01-21 14:11:00

回答

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] 
4

如果你是在Unix/Linux,你可以使用管道:

question.rb | answer.py 

然后question.rb的输出变得answer.py

我没有尝试过它最近的输入,但我有一种感觉,相同的语法也可以在Windows上工作。

+0

-1:这不会返回到Ruby程序的答案。 – nosklo 2009-01-21 14:17:35

+1

嗯...我不认为OP要求第二个程序返回并回答*到ruby程序*。我想这取决于你如何解释“回报”。 – Ben 2009-01-23 13:04:19

3

Pexpect的

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

Pexpect的是一个纯Python期望状 模块。 Pexpect使Python成为更好的 工具来控制其他 应用程序。

Pexpect是一个纯Python模块,用于产生子应用程序 ; 控制它们;并在其输出中响应 预期模式。 Pexpect像Don Libes的期待一样工作。 Pexpect允许您的脚本产生一个 子应用程序并控制它,就好像人类正在输入命令一样 。

+0

+1:pexpect可以做到。 – nosklo 2009-01-21 14:21:32

1

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

cat .profile .shrc | more 

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

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

+0

-1:使用管道意味着数据是单向的。他特意要求返回数据 – nosklo 2009-01-21 14:20:49

+0

这就是为什么我给出两种可能的解决方案的原因之一。 – 2009-01-21 14:32:07

3

首先检查了这一点: [UNIX管道] [1]

它可以在Windows或UNIX,但它的性能稍微dufferent,第一方案:

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 
相关问题