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

09-25 18:44