我四处搜索但我无法理解为什么会收到错误:
"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:我已经删除了超时代码并将代码缩减为您看到的内容,错误仍然存在
答案 0 :(得分:1)
重定向映射子进程中的文件描述符,例如:out
(或STDOUT
或1
)之一:
来自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()数组也不是符号数组。