A convenient and powerful API for interacting with external commands
Thiago Padilha
tpadilha84 at gmail.com
Fri Dec 22 17:18:29 EST 2017
Hello fellow Python users
I've always used Python as shell scripting language to automate tasks in various
projects, especially when doing complex work where Bash gets messy.
While Python is a much more powerful language than Bash, I've always
found the builtin subprocess.Popen APIs a bit inconvenient to invoke external
commands, especially for creating pipelines and doing redirection. Surely one
can use shell=True and Popen will invoke the shell, but this is not without
drawbacks since one has to deal with shell-specific syntax particularities,
such as argument quoting.
To make shell scripting in Python more convenient, I've created a new module:
https://github.com/tarruda/python-ush. The README and tests contains more
detailed examples but here's an idea of how it looks like:
import ush
sh = ush.Shell()
ls, sort = sh('ls', 'sort')
# by default, wait for command to exit and return status code for each in
# pipeline. stdin, stdout and stderr are inherited.
ls_exit_code, sort_exit_code = (ls | sort)()
# iterate output, line by line
for f in ls | sort:
print(f)
# collect all output into a string
str(ls('-la') | sort('--reverse'))
# redirect stdout
ls | sort | 'output.txt'
# append output to a file
(ls | sort | '+output.txt')()
# redirect stdin
('input.txt' | sort)()
# filename expansion
ls('*.py', glob=True)
The module is compatible with python 2 and 3, and should work on any Unix or
Windows. Also, since it is implemented in a single file (~650 LOC) without
dependencies, it should be easy to download and incorporate in a
another project.
Any feedback is appreciated
More information about the Python-list
mailing list