2009-01-21 51 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 
相關問題