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参数将文件作为参数来重定向您可能使用它运行的程序的输入和输出。
答案 0 :(得分: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
答案 1 :(得分:0)
如果您对其他选项不满意,则可以使用Stripe开源的python Subprocess
库的ruby端口。
https://github.com/stripe/subprocess
它具有popen
功能,例如
Subprocess.popen(
['python', 'foo.py'],
stdin: inFile,
stdout: outFile,
stderr: outFile)