_SUBP_CACHE = {}
def cached_subp(args, data=None, rcs=None, env=None, capture=True,
shell=False, logstring=False, decode="replace", target=None,
update_env=None):
def tupleize(d):
if d is None:
return d
elif isinstance(d, tuple):
return d
elif isinstance(d, dict):
return tuple(["%s=%s" % (k, env[k]) for k in sorted(d.keys())])
elif isinstance(d, list):
return tuple(d)
else:
return d
smashed = tuple([tupleize(d) for d in
(args, data, rcs, env, capture, shell, logstring, decode,
target, env)])
if smashed not in _SUBP_CACHE:
try:
print("MISS!")
_SUBP_CACHE[smashed] = subp(*smashed)
except Exception as e:
_SUBP_CACHE[smashed] = e
r = _SUBP_CACHE[smashed]
if isinstance(r, Exception):
raise r
return r