web-dev-qa-db-fra.com

Comment imprimer stdout immédiatement?

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?

15
xitryuga

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.

13
the Tin Man

Rincer la sortie

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
4
roychri