Skip to content

command and conquer them all, with live streams

Compare
Choose a tag to compare
@deajan deajan released this 30 May 11:58
· 90 commits to master since this release

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 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