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 every `check_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