txsh is a project largely inspired by [sh] (https://github.com/amoffat/sh). txsh is a dynamic wrapper around [Twisted] (http://twistedmatrix.com) [ProcessProtocol] (https://twistedmatrix.com/documents/current/api/twisted.internet.protocol.ProcessProtocol.html) and [spawnProcess] (http://twistedmatrix.com/documents/current/api/twisted.internet.interfaces.IReactorProcess.spawnProcess.html) that allows you to call any program as if it were a function and return a deferred with its exit code and output:
from twisted.internet import reactor
from txsh import ls
def my_callback(exc_info):
print 'Exit Code:', exc_info.status
print 'Output:', exc_info.stdout
print 'Errors:', exc_info.stderr
reactor.stop()
d = ls()
d.addCallback(my_callback)
reactor.run()
from txsh import ls, curl, wc, git, sudo
# arguments should go separated
d = ls("-l", "-h") # ls -l -h
# Keyword arguments are also supported
d = ls(help=True) # ls --help
# Underscores will be replaced by dashes
d = curl(connect_timeout=10, url="http://something")
# curl --connect-timeout 10 --url http:/something
# You can pipe
d = wc(ls())
# You can have subcommands
d = git.branch() # Same as git("branch")
d = sudo.ls("-h") # Same as sudo("ls", "-h")
# You can bake
ll = ls.bake("-l", "-h")
d = ll() # Now ll will always output ls -l -h
# You can redirect stderr or stdout to a file using special args _out and _err
d = ls("-l", _out=open('output.log', 'wb'))
# In fact, you can use any file-like object like a StringIO.
# A callabble.
def alert(error):
pass # Do something
d = ls("-l", _err=alert) # Will redirect stderr to alert function.
# If you pass a string, we will simply assume it's a filename.
d = ls("-l", _out="output.log", _err="error.log")
# You can also pass a DeferredQueue or a simple Deferred.
queue = DeferredQueue()
my_defer = Deferred()
d = ls("-l", _out=queue, _err=my_defer)
# When stdout is ready, it will call queue.put
# When stderr is ready, it will call my_defer.callback
txsh is not a collection of system commands implemented in Twisted.
$> pip install txsh
- Proper documentation / tutorials.
- Tests
- Passing of any object, Queue, or any iterable (list, set, dictionary, etc) to stdin
- Custom success exit codes
- Raising Failures if exit_code is not successful so user can add errbacks to deal with them.
- Glob Expansion
- Advanced piping
- usePTY
- Python 3