X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/00af5ad16232b856ef1f3620a4f62f0946c681a7..da85b5f1617656e03535dc490f027d7fae4d702e:/sdk/python/arvados/util.py diff --git a/sdk/python/arvados/util.py b/sdk/python/arvados/util.py index 7148b9295b..d5ea18ba49 100644 --- a/sdk/python/arvados/util.py +++ b/sdk/python/arvados/util.py @@ -7,6 +7,8 @@ import errno import sys from arvados.collection import * +HEX_RE = re.compile(r'^[0-9a-fA-F]+$') + def clear_tmpdir(path=None): """ Ensure the given directory (or TASK_TMPDIR if none given) @@ -28,7 +30,10 @@ def run_command(execargs, **kwargs): kwargs.setdefault('close_fds', True) kwargs.setdefault('shell', False) p = subprocess.Popen(execargs, **kwargs) - stdoutdata, stderrdata = p.communicate(None) + if kwargs['stdout'] == subprocess.PIPE: + stdoutdata, stderrdata = p.communicate(None) + else: + p.wait() if p.returncode != 0: raise errors.CommandFailedError( "run_command %s exit %d:\n%s" % @@ -160,7 +165,7 @@ def zipball_extract(zipball, path): break zip_file.write(buf) zip_file.close() - + p = subprocess.Popen(["unzip", "-q", "-o", "-d", path, @@ -306,3 +311,25 @@ def listdir_recursive(dirname, base=None): else: allfiles += [ent_base] return allfiles + +def is_hex(s, *length_args): + """is_hex(s[, length[, max_length]]) -> boolean + + Return True if s is a string of hexadecimal digits. + If one length argument is given, the string must contain exactly + that number of digits. + If two length arguments are given, the string must contain a number of + digits between those two lengths, inclusive. + Return False otherwise. + """ + num_length_args = len(length_args) + if num_length_args > 2: + raise ArgumentError("is_hex accepts up to 3 arguments ({} given)". + format(1 + num_length_args)) + elif num_length_args == 2: + good_len = (length_args[0] <= len(s) <= length_args[1]) + elif num_length_args == 1: + good_len = (len(s) == length_args[0]) + else: + good_len = True + return bool(good_len and HEX_RE.match(s))