34 lines
847 B
Python
Executable File
34 lines
847 B
Python
Executable File
import base64
|
|
import json
|
|
import os
|
|
import sys
|
|
import time
|
|
import traceback
|
|
from io import StringIO
|
|
from subprocess import PIPE, Popen, TimeoutExpired
|
|
|
|
def popen(cmd, sys_env=True, **kwargs):
|
|
if sys_env and kwargs.get('env') is not None:
|
|
kwargs['env'] = os.environ.copy().update(kwargs['env'])
|
|
return Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, encoding='utf-8', **kwargs)
|
|
|
|
|
|
def execute(cmd, input_str=None, timeout=None, **kwargs):
|
|
p = popen(cmd, **kwargs)
|
|
try:
|
|
out, err = p.communicate(input_str, timeout=timeout)
|
|
except TimeoutExpired:
|
|
out = ''
|
|
err = get_exception()
|
|
p.kill()
|
|
stat = p.returncode
|
|
return stat, out, err
|
|
|
|
|
|
def get_exception():
|
|
with StringIO() as io:
|
|
traceback.print_exc(file=io)
|
|
io.seek(0)
|
|
content = io.read()
|
|
|
|
return content |