Ruby Spawn不接受IO.pipe

时间:2015-01-11 11:22:09

标签: ruby process spawn

我四处搜索但我无法理解为什么会收到错误:

"in `spawn': no implicit conversion of IO into String"

以下简单方法

def execute_with_timeout(cmd)
  pipe_cmd_out = IO.pipe
  pid = Process.spawn(cmd, :out => pipe_cmd_out, :pgroup => true)
  Process.waitpid(pid, 0)
  pipe_cmd_out.close
  $?.exitstatus == 0
end

我在哪里犯这个错误?

感谢。

PS:我已经删除了超时代码并将代码缩减为您看到的内容,错误仍然存​​在

1 个答案:

答案 0 :(得分:1)

重定向映射子进程中的文件描述符,例如:out(或STDOUT1)之一:

  1. io:指定为io.fileno的文件描述符 ...
    ...
  2. 来自pipe()docs:

      

    pipe() - > [read_io,write_o]:
      创建一对管道端点(相互连接)并将它们作为两元素数组返回   IO对象:[read_io,write_io]。

    http://ruby-doc.org/core-2.2.0/IO.html#method-c-pipe

    所以,你可以这样做:

    def execute_with_timeout(cmd)
      reader, writer = IO.pipe
      puts reader, writer
    
      pid = Process.spawn(
        cmd, 
        :pgroup => true,
        :out => writer.fileno,  #Redirect child STDOUT into one end of the pipe.
      )
    
      Process.waitpid(pid, 0)
    
      puts reader.gets  #Read from the other end of the pipe in the parent.
    
      writer.close
      reader.close
    
      $?.exitstatus == 0
    end
    
    result = execute_with_timeout('ls')
    puts result
    
    --output:--
    #<IO:0x000001009a0140>
    #<IO:0x000001009a0118>
    1.rb
    true
    
      

    我在哪里犯这个错误?

    spawn()文档说:

      

    要重定向到文件,请改用数组:

     id = spawn(command, :out=>["log", "w"])  
    
         

    数组指定文件名,标志和权限。

    http://ruby-doc.org/core-2.1.3/Process.html#method-c-spawn

    您的pipe()调用返回一个IO对象数组,您将其用作:out键的值。但是因为spawn()期望将一个字符串数组作为值,所以ruby会尝试将IO对象转换为字符串,这会产生错误:

    "in `spawn': no implicit conversion of IO into String"
    

    spawn()文档确实显示了一个示例,其中与其中一个重定向键对应的值不是字符串数组:

     :err=>[:child, :out]
    

    (表示将:err(在孩子中)重定向到child :out)。但是你的pipe()数组也不是符号数组。