Skip to main content

Opinionated version of Python's subprocess

Project description

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 !

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

extern-0.4.1.tar.gz (6.3 kB view details)

Uploaded Source

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

Hashes for extern-0.4.1.tar.gz
Algorithm Hash digest
SHA256 0ff01adc2ad423f3d1e31641024b3974569fb0127b4d925bc6bed1cb86b6b1e4
MD5 cde56a0001cc8164423d034b76a0d202
BLAKE2b-256 82115fb2720d54499141da8d50c9dd59ffffd89a9a735f9ff2fe1defbea0132b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page