import binascii import six if six.PY2: import commands get_command_output = commands.getoutput get_command_status_output = commands.getstatusoutput cmp_ = cmp else: def get_command_status_output(command): try: import subprocess return ( 0, subprocess.check_output( command, shell=True, universal_newlines=True).rstrip()) except subprocess.CalledProcessError as e: return (e.returncode, e.output) def get_command_output(command): return get_command_status_output(command)[1] cmp_ = lambda x, y: (x > y) - (x < y) def bitcast_to_string(b): """ Take a string(PY2) or a bytes(PY3) object and return a string. The returned string contains the exact same bytes as the input object (latin1 <-> unicode transformation is an identity operation for the first 256 code points). """ return b if six.PY2 else b.decode("latin1") def bitcast_to_bytes(s): """ Take a string and return a string(PY2) or a bytes(PY3) object. The returned object contains the exact same bytes as the input string. (latin1 <-> unicode transformation is an identity operation for the first 256 code points). """ return s if six.PY2 else s.encode("latin1") def unhexlify(hexstr): """Hex-decode a string. The result is always a string.""" return bitcast_to_string(binascii.unhexlify(hexstr)) def hexlify(data): """Hex-encode string data. The result if always a string.""" return bitcast_to_string(binascii.hexlify(bitcast_to_bytes(data)))