def make_code_from_pyc(filename): """Get a code object from a .pyc file.""" try: fpyc = open(filename, "rb") except IOError: raise NoCode("No file to run: '%s'" % filename) with fpyc: # First four bytes are a version-specific magic number. It has to # match or we won't run the file. magic = fpyc.read(4) if magic != PYC_MAGIC_NUMBER: raise NoCode("Bad magic number in .pyc file: {} != {}".format( magic, PYC_MAGIC_NUMBER)) date_based = True if env.PYBEHAVIOR.hashed_pyc_pep552: flags = struct.unpack('<L', fpyc.read(4))[0] hash_based = flags & 0x01 if hash_based: fpyc.read(8) # Skip the hash. date_based = False if date_based: # Skip the junk in the header that we don't need. fpyc.read(4) # Skip the moddate. if env.PYBEHAVIOR.size_in_pyc: # 3.3 added another long to the header (size), skip it. fpyc.read(4) # The rest of the file is the code object we want. code = marshal.load(fpyc) return code
def make_code_from_pyc(filename): """Get a code object from a .pyc file.""" try: fpyc = open(filename, "rb") except IOError: raise NoCode("No file to run: %r" % filename) try: # First four bytes are a version-specific magic number. It has to # match or we won't run the file. magic = fpyc.read(4) if magic != imp.get_magic(): raise NoCode("Bad magic number in .pyc file") # Skip the junk in the header that we don't need. fpyc.read(4) # Skip the moddate. if sys.version_info >= (3, 3): # 3.3 added another long to the header (size), skip it. fpyc.read(4) # The rest of the file is the code object we want. code = marshal.load(fpyc) finally: fpyc.close() return code
def make_code_from_pyc(filename): try: fpyc = open(filename, 'rb') except IOError: raise NoCode('No file to run: %r' % filename) try: magic = fpyc.read(4) if magic != imp.get_magic(): raise NoCode('Bad magic number in .pyc file') fpyc.read(4) if sys.version_info >= (3, 3): fpyc.read(4) code = marshal.load(fpyc) finally: fpyc.close() return code