def call(cmd, cwd='.', env=None, capture=False, raise_on_error=True,
timeout=DEFAULT_TIMEOUT):
"""Call invoke command with additional envs and return output."""
env = env or {}
env_str = ' '.join(
['%s="%s"' % (k, v) for k, v in env.iteritems()])
print ('Running:\n cmd: %s %s\n cwd: %s' % (env_str, cmd, cwd)).strip()
final_env = os.environ.copy()
final_env.update(env)
with Popen(
cmd, shell=True, cwd=cwd, env=final_env, preexec_fn=os.setsid,
stdout=subprocess.PIPE if capture else None) as proc:
threading.Thread(target=kill_when_timeout, args=(proc, timeout)).start()
out, _ = proc.communicate()
if proc.returncode != 0 and raise_on_error:
raise subprocess.CalledProcessError(
returncode=proc.returncode, cmd=cmd, output=out)
return proc.returncode, out
评论列表
文章目录