Simple wrapper around subprocess.Popen.
Multiple commands can be configured to be executed. Each command can have some predetermined parameters and additional parameters or overrides can be passed when application is executed. Multiple instances of one application can be running using aliases.
To communicate to running processes Channel classes from yet-another-io-channels-library are used.
Examples:
Using STDIO.
runner = Runner()
runner.add("cat", "cat")
runner.start('cat')
channel = runner.get_channel('cat')
channel.write(b'hello, world')
# later
line = channel.read() # Will return b'hello, world'
Using UNIX socket.
runner = Runner()
self._runner.add("socat", "socat SYSTEM:cat UNIX-LISTEN:socket",
type="socket", socket="socket")
runner.start('socat')
channel = runner.get_channel('socat')
channel.write(b'hello, world')
# later
line = channel.read() # Will return b'hello, world'
Runner(*, extra_paths=None)
Create a new runner object.
extra_paths
: List of paths which will be appended to PATH environment variable
add(self, name, command, **kwargs)
Add the application to the list of registered applications or update if already added.
name
: application namecommand
: the command to be executed
**kwargs
can include the following:
type
: eitherstdio
orsocket
. Default isstdio
cwd
: working directory of the processsocket
: if type issocket
, this is the name of the UNIX socket file to connect tosetpgrp
: ifTrue
the process is moved to a separate process group and will not receive signals sent to main process. Default isFalse
buffering
: if set to"line"
the channel is line-buffered for reading
update_config(self, config)
Config must be a dictionary where each key is an alias of an
application and value is a dictionary of that application's
configuration. runner.add("app", "command", **kwargs)
is equivalent
to runner.update_config({"app": {"command": "command", **kwargs}})
. Useful for adding multiple applications at once.
ensure_running(self, app_name, alias=None, with_args=None, **kwargs)
start(self, app_name, alias=None, with_args=None, **kwargs)
Start the process. If the process with the same alias is already
running, start
will raise ProcessExistsException
, while
ensure_running
will silently do nothing.
app_name
: application alias, given in the configurationalias
: alias that will be given to actual started process. IfNone
, application alias will be usedwith_args
: list of additional arguments that will be added to the commandkwargs
: extend or override parameters in application config
get_channel(self, alias)
Returns the Channel
object to communicate to the running process.
terminate(self, alias)
Terminates the process.