command and conquer them all, with live streams
This is a feature rich release which primary function is to allow background jobs to report live stdout/stderr stream data to your favorite application by using queues or callback functions.
It also fixes a couple of Python 2.7 & PyPy issues.
Features
- command_runner now has a
command_runner_threaded()
function which allows to run in background, but stil provide live stdout/stderr stream output via queues/callbacks - Refactor poller mode to allow multiple stdout / stderr stream redirectors
- Passing a queue.Queue() instance to stdout/stderr arguments will fill queue with live stream output
- Passing a function to stdout/stderr arguments will callback said function with live stream output
- Passing a string to stdout/stderr arguments will redirect stream into filename described by string
- Added
split_stream
argument which will make command_runner return (exit_code, stdout, stderr) instead of (exit_code, output) tuple - Added
check_interval
argument which decides how much time we sleep between two checks, defaults to 0.05 seconds.
Lowering this improves responsiveness, but increases CPU usage. Default value should be more than reasaonable for most applications - Added
stop_on
argument which takes a function, which is called everycheck_interval
and will interrupt execution if it returns True - Added
process_callback
argument which takes a function(process), which is called upon execution with a subprocess.Popen object as argument for optional external process control - Possibility to disable command_runner stream encoding with
encoding=False
so we get raw output (bytes) - Added more unit tests (stop_on, process_callback, stream callback / queues, to_null_redirections, split_streams)
Fixes
- Fix unix command provided as list didn't work with
shell=True
- Fixed more Python 2.7 UnicodedecodeErrors on corner case exceptions catches
- Fixed python 2.7 TimeoutException output can fail with UnicodedecodeError
- Fix Python 2.7 does not have subprocess.DEVNULL
- Ensure output is always None if process didn't return any string on stdout/stderr on Python 2.7
- Fix python 2.7 process.communicate() multiple calls endup without output (non blocking process.poll() needs communicate() when using shell=True)
Misc
- Removed queue usage in monitor mode (needs lesser threads)
- Optimized performance
- Added new exit code -250 when queue/callbacks are used with monitor method or unknown method has been called
- Optimized tests