Avoiding `readavailable()` when communicating with long-lived external program

readuntil(p::Pipe, s) is likewise not supported.

readuntil is currently supported for all IO types, so I’m not sure what you meant here:

julia> @which readuntil(Pipe(), "Done")
readuntil(io::Base.AbstractPipe, arg::AbstractString; kw...) in Base at io.jl:371

using bytesavailable

bytesavailable is mostly just a worse version of readavailable (the similarity in name is intentional)

use IOBuffer

We have an open issue about this: IOBuffer is probably not what you want. You could use Base.BufferStream, but really that will just create a Pipe, and can just use Pipe directly anyways.

use Pipe

Using Base.PipeEndpoint in these examples can be slightly more efficient (and saves you from the requirement to call close(out.in); close(in.out)), but it otherwise equivalent functionally.

using Base.start_reading

Don’t do this, you’ll confuse the internal state, and can just end up with even more problems