Zulip Chat Archive
Stream: lean4
Topic: Flushing stdout in elab commands
Anne Baanen (Oct 28 2024 at 10:04):
I'm trying to write an elab command that does some heavy computation (about 20 minutes' worth, currently). Especially for debugging, it would be nice if I could use println! to see intermediate results before the whole computation is finished. But as far as I can tell, all the output is only flushed when the command is done. Minimized example:
import Lean.Elab.Command
open Lean
def flushTest : IO Unit := do
println! "Unflushed hello!"
IO.sleep 500
println! "Flushed hello!"
(← IO.getStdout).flush
IO.sleep 500
println! "Bye!"
elab "#flushTest" : command =>
Elab.Command.liftCoreM flushTest
#flushTest
def main := flushTest
I would expect that the three println!s would appear with 500 ms delay between each, or at least the "Flushed hello!" would appear before the "Bye!". But both in my editor (nvim) and building on the command line (with lean flushTest.lean) all three lines appear together, after a second of waiting. On the other hand, when I execute the code (using lean --run flushTest.lean) the three lines do appear separately with about 500ms delay between each as I would expect.
Would it be possible to flush stdout in elab commands?
Damiano Testa (Oct 28 2024 at 10:07):
I think that this came up other times and the answer was that this was not really possible.
I would be very happy to have partial information available, though, so I hope that I am wrong about this!
Joachim Breitner (Oct 28 2024 at 11:45):
Try passing -D stderrAsMessages=true to lean
Anne Baanen (Oct 28 2024 at 11:46):
That doesn't seem to change anything :( (Also if I replace (← IO.getStdout).flush with (← IO.getStderr).flush...)
Daniel Weber (Oct 28 2024 at 14:57):
What if you use IO.eprintln?
Last updated: May 02 2025 at 03:31 UTC