2016-02-05 183 views
1

在Ruby中是否有等價的subprocess.Popen()?我必須並行運行一些程序並重定向它們的I/O。 喜歡的東西Ruby中subprocess.Popen()的等價物?

p = subprocess.Popen("python foo.py", stdin=inFile, stdout=outFile, stderr=outFile) 

UPDATE:subprocess.Popen是一個Python類,允許的處理並行執行。第一個參數是要執行的語句。它可能是一個簡單的'ls'命令或編譯C程序的命令。 stdin,stdout和stderr參數將文件作爲參數來重定向您可能使用它運行的程序的輸入和輸出。

+1

它會幫助如果你解釋一下'subprocess.Popen()'是做什麼的。否則,您可以人爲地將能夠回答您問題的人員限制在非常熟悉* [tag:ruby]和[tag:python]中的流程管理的人員的交集處。 –

回答

5

Open3#popen3將是有用的。

假設你有一個test.rb文件,如下圖所示:

v = gets.chomp 
puts "#{v} @ #{Time.new}" 

你可以這樣做:

require "open3" 

stdin, stdout, stderr, wait_thr = Open3.popen3("ruby test.rb") 

stdin.puts("hi") 
puts stdout.gets(nil) 
#=> hi @ 2016-02-05 19:18:52 +0530 

stdin.close 
stdout.close 
stderr.close 

對於多個子進程並行執行,你可以使用線程作爲如下所示:

require "open3" 

t1 = Thread.new do |t| 
    stdin, stdout, stderr, wait_thr1 = Open3.popen3("ruby test.rb") 
    stdin.puts("Hi") 
    puts stdout.gets(nil) 
end 

t2 = Thread.new do |t| 
    stdin, stdout, stderr, wait_thr1 = Open3.popen3("ruby test.rb") 
    stdin.puts("Hello") 
    puts stdout.gets(nil) 
end 

t1.join 
t2.join 
+0

2件事。這可以並行運行嗎?那就是我可以並行運行多個Open3.popen3實例而無需等待1完成?其次,我可以使用它編譯程序嗎?像「gcc foo.cpp」。 –

+0

@Maruthgoyal不確定平行部分。編譯應該沒問題 –

+0

@Maruthgoyal你將不得不使用線程來執行並行執行 –