Platform-specific code lives here.

This is its own module to abstract away what would otherwise be distracting logic-flow interruptions.

invoke.platform.WINDOWS = False

Whether or not the current platform appears to be Windows in nature.

Note that Cygwin’s Python is actually close enough to “real” UNIXes that it doesn’t need (or want!) to use PyWin32 – so we only test for literal Win32 setups (vanilla Python, ActiveState etc) here.


Query stream input_ to see how many bytes may be readable.


If we are unable to tell (e.g. if input_ isn’t a true file descriptor or isn’t a valid TTY) we fall back to suggesting reading 1 byte only.

Parameters:input – Input stream object (file-like).
Returns:int number of bytes to read.
invoke.platform.character_buffered(*args, **kwds)

Force local terminal stream be character, not line, buffered.

Only applies to Unix-based systems; on Windows this is a no-op.


Determine current local pseudoterminal dimensions.

Returns:A (num_cols, num_rows) two-tuple describing PTY size. Defaults to (80, 24) if unable to get a sensible result dynamically.

Test input_ to determine whether a read action will succeed.

Parameters:input – Input stream object (file-like).
Returns:True if a read should succeed, False otherwise.

Detect if given stdin stream seems to be in the foreground of a TTY.

Specifically, compares the current Python process group ID to that of the stream’s file descriptor to see if they match; if they do not match, it is likely that the process has been placed in the background.

This is used as a test to determine whether we should manipulate an active stdin so it runs in a character-buffered mode; touching the terminal in this way when the process is backgrounded, causes most shells to pause execution.


Processes that aren’t attached to a terminal to begin with, will always fail this test, as it starts with “do you have a real fileno?”.