Skip to content

Instantly share code, notes, and snippets.

@kiorky
Last active October 2, 2016 20:50
Show Gist options
  • Save kiorky/407e446b8473f854aad3b20d1574c9da to your computer and use it in GitHub Desktop.
Save kiorky/407e446b8473f854aad3b20d1574c9da to your computer and use it in GitHub Desktop.
cmdrun
import subprocess
class ProcessError(IOError):
pass
def cmdrun(cli,
debug=False,
shell=True,
env=None,
cwd=None,
wait=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
raise_error=True,
stdin=None,
*args,
**kwargs):
if cwd is None:
cwd = os.getcwd()
if env is None:
env = copy.deepcopy(os.environ)
kwargs.setdefault('cwd', cwd)
kwargs.setdefault('stdout', stdout)
kwargs.setdefault('stderr', stderr)
kwargs.setdefault('stdin', stdin)
kwargs.setdefault('env', env)
out, err = None, None
if isinstance(cli, six.string_types):
cli = shlex.split(cli)
if debug:
print(' '.join(cli), file=sys.stderr)
pr = subprocess.Popen(cli, *args, **kwargs)
if wait:
out, err = pr.communicate()
if raise_error and pr.returncode != 0:
if out:
print(out, file=sys.stderr)
if err:
print(err, file=sys.stderr)
raise ProcessError(cli)
return {'out': out, 'err': err, 'pr': pr}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment