我使用Stockfish来分析国际象棋的位置,但具体的背景并不重要。我想实时读取程序的输出,而不必等到过程完成。特别是我想阅读最后几行或最后几行。目前我有:
require 'pty'
master, slave = PTY.open
read, write = IO.pipe
pid = spawn("stockfish", :in=>read, :out=>slave)
calculating=0
slave.close
read.close
write.puts('uci')
write.puts("setoption name Threads value 1")
write.puts("position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR")
write.puts('go infinite')
while calculating<10
sleep(1)
master.each do |line|
puts line
end
calculating+=1
end
write.puts('quit')
write.close
puts "done"
这个问题是程序在完成所有10个循环之前没有看到EOF标记,因此它会无限期地卡在master.each
行块中。我可以使用master.gets
一次一行地阅读下一行,但是如何阅读最后一行呢?
答案 0 :(得分:0)
我现在有一个有效的解决方案:
fen="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"
overseer=fork do
require 'pty'
master, slave = PTY.open
read, write = IO.pipe
pid = spawn("stockfish", :in=>read, :out=>slave)
slave.close
read.close
write.puts('uci')
write.puts("setoption name Threads value 4")
write.puts("position fen #{fen}")
write.puts('go infinite')
loop do
puts master.gets
end
end
if $stdin.gets
Process.kill("KILL",overseer)
end
这将打印出一个流流,直到用户将其杀死为止。