Provides the IOCapture.capture(f)
function which evaluates the function f
, captures the
standard output and standard error, and returns it as a string, together with the return
value. For example:
julia> c = IOCapture.capture() do
println("test")
return 42
end;
julia> c.value, c.output
(42, "test\n")
See the docstring for full documentation.
The capturing does not work properly if f
prints to the stdout
object that has been
stored in a separate variable or object, e.g.:
julia> const original_stdout = stdout;
julia> c = IOCapture.capture() do
println("output to stdout")
println(original_stdout, "output to original stdout")
end;
output to original stdout
julia> c.output
"output to stdout\n"
Relatedly, it is possible to run into errors if the stdout
or stderr
objects from
within a capture
are being used in a subsequent capture
or outside of the capture:
julia> c = IOCapture.capture() do
return stdout
end;
julia> println(c.value, "test")
ERROR: IOError: stream is closed or unusable
Stacktrace:
[1] check_open at ./stream.jl:328 [inlined]
[2] uv_write_async(::Base.PipeEndpoint, ::Ptr{UInt8}, ::UInt64) at ./stream.jl:959
...
This is because stdout
and stderr
within an capture
actually refer to the temporary
redirect streams which get cleaned up at the end of the capture
call.
On Julia 1.5 and earlier, setting color
to true
has no effect, because the ability to
set IOContext
attributes on redirected streams was added in
1.6. I.e. on those older Julia versions the
captured output will generally not contain ANSI color escape sequences.
- Suppressor.jl provides similar functionality, but with a macro-based interface.