Skip to content
txsh - asynchronous practical shell
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


txsh is a project largely inspired by [sh] ( txsh is a dynamic wrapper around [Twisted] ( [ProcessProtocol] ( and [spawnProcess] ( 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

d = ls()


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 ="-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
You can’t perform that action at this time.