Extern
Extern is an opinionated version of Python's subprocess, making it just that
little bit more convenient to run shell commands from within Python code. Extern
is Python-3 only, and is no longer compatible with Python-2, as of version
0.4.0.
It is reasonably straightforward:
>>> import extern
>>> extern.run("echo it works") #=> returns 'it works\n'
>>> extern.run("echo 1 2 5 |cat") #=> returns '1 2 5\n'
When a command that fails is run e.g.
>>> extern.run("cat /not_a_file")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.linux-x86_64/egg/extern/__init__.py", line 29, in run
extern.ExternCalledProcessError: Command cat /not_a_file returned non-zero exit status 1.
STDERR was: cat: /not_a_file: No such file or directory
STDOUT was:
an exception is raised just like subprocess. However, the error message
generated includes STDERR and STDOUT, which is more convenient for debugging. For reference, the subprocess equivalent:
>>> subprocess.check_output(['bash','-c','cat /not_a_file'])
cat: /not_a_file: No such file or directory
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 573, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['bash', '-c', 'cat /not_a_file']' returned non-zero exit status 1
The useful thing is that Extern collects STDERR and only reports it when there is a non-zero exit status, discarding it otherwise.
IMPORTANT: use of this library with untrusted strings presents a security risk in the same way as little bobby tables, and shell=True in subprocess.
###Multiple commands run simultaneously
>>> extern.run_many(['echo once','echo twice','echo thrice'])
#=> ['once\n', 'twice\n', 'thrice\n']
Progress can also be observed:
>>> extern.run_many(['echo once','echo twice','echo thrice'], progress_stream=sys.stderr)
Finished processing 3 of 3 (100.00%) items.
#=> ['once\n', 'twice\n', 'thrice\n']
STDIN can be provided to run():
extern.run('cat',stdin='dog') #=> 'dog'
###Which
There is also a which function, useful for determing where (and if) a program
exists on the command line:
>>> import extern
>>> extern.which('cat') #=> '/bin/cat'
>>> extern.which('dog') #=> None
Installation
You can also install it directly from the Python Package Index with this command:
sudo pip install extern
Licence
See file LICENCE.txt in this folder
Contribute
Extern is an open-source software. Everyone is welcome to contribute !
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file extern-0.4.1.tar.gz.
File metadata
- Download URL: extern-0.4.1.tar.gz
- Upload date:
- Size: 6.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ff01adc2ad423f3d1e31641024b3974569fb0127b4d925bc6bed1cb86b6b1e4
|
|
| MD5 |
cde56a0001cc8164423d034b76a0d202
|
|
| BLAKE2b-256 |
82115fb2720d54499141da8d50c9dd59ffffd89a9a735f9ff2fe1defbea0132b
|