Comment puis-je sortir immédiatement stdout
? stdout
va s'imprimer une fois toutes les saisies terminées.
require 'open3'
def run(cmd)
Open3.popen3(cmd) do |stdin, stdout, stderr, thread|
Thread.new do
stdout.each {|l| puts l}
end
Thread.new do
while thread.alive?
stdin.puts $stdin.gets
end
end
thread.join
end
end
run ("Ruby file_to_test.rb")
file_to_test.rb:
puts "please, enter s"
puts "please, enter q"
s = gets.chomp!
q = gets.chomp!
puts s
puts q
Le résultat après avoir exécuté main.rb est:
somestring
somestring2
please, enter s
please, enter q
somestring
somestring2
Comment puis-je sortir immédiatement stdout
?
Ruby met en tampon la sortie jusqu'à ce que le tampon de sortie soit plein. Pour modifier le comportement afin qu'il écrive automatiquement, utilisez sync
et sync=
:
old_sync = $stdout.sync
$stdout.sync = true
puts "immediately output lotsa stuff"
puts "immediately output lotsa stuff"
puts "immediately output lotsa stuff"
puts "immediately output lotsa stuff"
# reenable the default behavior
$stdout.sync = old_sync
À partir de la documentation de sync=
:
Définit le "mode de synchronisation" sur vrai ou faux. Lorsque le mode de synchronisation est vrai, toutes les sorties sont immédiatement vidées vers le système d'exploitation sous-jacent et ne sont pas mises en mémoire tampon en interne.
Il est important de comprendre que l'activation du vidage automatique du tampon peut en fait ralentir la vitesse d'exécution globale de votre code, en particulier si vous écrivez dans un fichier ou un appareil qui souhaite recevoir ses données par blocs. Utilisez sync
ou rincez soigneusement.
Ce que vous recherchez est de vider le flux io en utilisant la méthode de vidage.
Essayez ce qui suit après chaque itération ou chaque mise:
stdout.flush
Si vous aviez plusieurs puts d'affilée, je suggérerais de faire un flush après le dernier, donc vous ne le faites pas trop souvent. Exemple:
stdout.puts "Hello"
stdout.puts "Mate"
stdout.flush