相当于Ruby中的subprocess.Popen()?

时间:2016-02-05 13:08:48

标签: python ruby

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参数将文件作为参数来重定向您可能使用它运行的程序的输入和输出。

2 个答案:

答案 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)