2013-01-07 202 views
1

我目前正試圖找出一種方法來從Ruby調用Perl腳本,並將其輸出,就好像我在終端中一樣,並允許我在需要時提供輸入。從Ruby調用Perl腳本

我已經想通了如何做到這一點,並在事後得到輸入,但由於Perl腳本仍在運行,我無法運行其他任何東西。

我應該注意到我無法編輯Perl腳本。正在提供這些腳本,並且正在製作這個Ruby腳本,以便更輕鬆地運行所有Perl腳本並確保它們按正確順序運行。

upgradestatus = `#{upgradearray[arraylocation]}` 

這將是我的代碼的相關部分。我嘗試了一些如何做到這一點的其他變體,但我每次都得到相同的情況。腳本開始運行時需要輸入,因此它只是坐在那裏。

+0

你的問題需要更清晰。也許你應該告訴我們你做了什麼或者發佈了僞代碼,以便我們看到你期望的輸入,輸出和控制流。 – sunnyrjuneja

+0

子進程通常會繼承父進程的句柄,包括STDIN。這足夠好嗎? – ikegami

+0

你可以使用[this](http://stackoverflow.com/questions/3159945/running-command-line-commands-within-ruby-script)來從命令行調用perl嗎? – sunnyrjuneja

回答

0

你不能用反引號%x或者作爲普通的子shell來做你想做的事情,因爲他們缺乏觀察子命令輸出輸出的能力。

你可以使用Open3的popen2popen3方法。他們讓你發送到被叫節目的STDIN流,並從STDOUT接收數據。 popen3也可以讓你看到/捕獲標準輸出流。不幸的是,在被調用的程序返回它的信息之前,通常你必須發送,然後關閉STDIN流,這可能是Perl腳本的情況。

如果您需要更多控制,請使用Ruby的內置Pty模塊進行調查。它旨在讓您通過腳本機制與正在運行的應用程序交談。您必須設置代碼來查找提示,然後通過發回適當的數據來回應它們。它可以很簡單,也可以是一個主要的PITA,具體取決於你所說的代碼。

這是open命令的例子:

PTY.open {|m, s| 
p m  #=> #<IO:masterpty:/dev/pts/1> 
p s  #=> #<File:/dev/pts/1> 
p s.path #=> "/dev/pts/1" 
} 

# Change the buffering type in factor command, 
# assuming that factor uses stdio for stdout buffering. 
# If IO.pipe is used instead of PTY.open, 
# this code deadlocks because factor's stdout is fully buffered. 
require 'io/console' # for IO#raw! 
m, s = PTY.open 
s.raw! # disable newline conversion. 
r, w = IO.pipe 
pid = spawn("factor", :in=>r, :out=>s) 
r.close 
s.close 
w.puts "42" 
p m.gets #=> "42: 2 3 7\n" 
w.puts "144" 
p m.gets #=> "144: 2 2 2 2 3 3\n" 
w.close 
# The result of read operation when pty slave is closed is platform 
# dependent. 
ret = begin 
     m.gets   # FreeBSD returns nil. 
    rescue Errno::EIO # GNU/Linux raises EIO. 
     nil 
    end 
p ret #=> nil 
+0

謝謝你的幫助。如果我的理解正確,這看起來應該起作用。所需的輸入只是對可能的錯誤作出反應,並確認腳本應該運行,以便編程。但是,當我嘗試運行你輸入的內容時,我會得到「test.rb:1:uninitialized constant PTY( NameError)「 –

+0

也許你應該嘗試'require'pty''? –

+0

這看起來像解決方案應該工作,但我很難讓它工作。不過,我想出了一個適用於我的解決方案。我催生了這個劇本。腳本可以通過一個簡單的sql命令檢測到,所以我只是讓它循環和睡眠幾秒鐘,直到它在繼續之前不能再檢測到它。不是最優雅的解決方案,但速度快,所以這個腳本是可用的,然後我可以更新它,因此它是完全自動的。我能夠得到最好的解決方案。 –