Ruby中是否有与subprocess.Popen()等价的函数我必须并行运行一些程序并重定向它们的I/O。
有点像
p = subprocess.Popen("python foo.py", stdin=inFile, stdout=outFile, stderr=outFile)
UPDATE:subprocess.Popen是一个允许并行执行进程的Python类第一个参数是要执行的语句它可以是一个简单的'ls'命令,也可以是一个编译c程序的命令。stdin、stdout和stderr参数将文件作为参数,以重定向可能使用它运行的程序的输入和输出。
最佳答案
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