Skip to content

Capturing standard output and error streams in Julia.

License

Notifications You must be signed in to change notification settings

JuliaDocs/IOCapture.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

IOCapture

version Documentation Run tests pkgeval codecov

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.

Known limitations

Separately stored stdout or stderr objects

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.

ANSI color / escape sequences

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.

Similar packages

  • Suppressor.jl provides similar functionality, but with a macro-based interface.