Redirecting standard streams#

Pyodide has three functions pyodide.setStdin(), pyodide.setStdout(), and pyodide.setStderr() that change the behavior of reading from stdin and writing to stdout and stderr respectively.

setStdin({stdin?, isatty?, error?}) takes a function which should take zero arguments and return either a string or an ArrayBufferView of information read from stdin. The isatty argument signals whether isatty(stdin) should be true or false. If you pass error: true then reading from stdin will return an error. If setStdin is called with no arguments, the default value is restored. In Node the default behavior is to read from process.stdin and in the browser it is to throw an error.

setStdout({batched?, raw?, isattty?}) sets the standard out handler and similarly setStderr (same arguments) sets the stdandard error handler. If a raw handler is provided then the handler is called with a number for each byte of the output to stdout. The handler is expected to deal with this in whatever way it prefers. isattty again controls whether isatty(stdout) returns true or false.

On the other hand, a batched handler is only called with complete lines of text (or when the output is flushed). A batched handler cannot have isatty set to true because it is impossible to use such a handler to make something behave like a tty.

Passing neither raw nor batched sets the default behavior. In Node the default behavior is to write directly to process.stdout and process.stderr (in this case isatty depends on whether process.stdout and process.stderr are ttys). In browser, the default behavior is achieved with pyodide.setStdout({batched: console.log}) and pyodide.setStderr({batched: console.warn}).

The arguments stdin, stdout, and stderr to loadPyodide provide a diminished amount of control compared to setStdin, setStdout, and setStderr. They all set isatty to false and use batched processing for setStdout and setStderr. In most cases, nothing is written or read to any of these streams while Pyodide is starting, so if you need the added flexibility you can wait until Pyodide is loaded and then use the pyodide.setStdxxx apis.