(dist_filename)
Extract configuration data from a bdist_wininst .exe

    Returns a configparser.RawConfigParser, or None
Extract configuration data from a bdist_wininst .exe
Extract configuration data from a bdist_wininst . exe
def extract_wininst_cfg(dist_filename):
    """Extract configuration data from a bdist_wininst .exe

    Returns a configparser.RawConfigParser, or None
    """
    f = open(dist_filename, 'rb')
    try:
        endrec = zipfile._EndRecData(f)
        if endrec is None:
            return None

        prepended = (endrec[9] - endrec[5]) - endrec[6]
        if prepended < 12:  # no wininst data here
            return None
        f.seek(prepended - 12)

        tag, cfglen, bmlen = struct.unpack("<iii", f.read(12))
        if tag not in (0x1234567A, 0x1234567B):
            return None  # not a valid tag

        f.seek(prepended - (12 + cfglen))
        init = {'version': '', 'target_version': ''}
        cfg = configparser.RawConfigParser(init)
        try:
            part = f.read(cfglen)
            # Read up to the first null byte.
            config = part.split(b'\0', 1)[0]
            # Now the config is in bytes, but for RawConfigParser, it should
            #  be text, so decode it.
            config = config.decode(sys.getfilesystemencoding())
            cfg.readfp(six.StringIO(config))
        except configparser.Error:
            return None
        if not cfg.has_section('metadata') or not cfg.has_section('Setup'):
            return None
        return cfg

    finally:
        f.close()
def extract_wininst_cfg ( dist_filename ) : f = open ( dist_filename , 'rb' ) try : endrec = zipfile . _EndRecData ( f ) if endrec is None : return None prepended = ( endrec [ 9 ] - endrec [ 5 ] ) - endrec [ 6 ] if prepended < 12 : # no wininst data here return None f . seek ( prepended - 12 ) tag , cfglen , bmlen = struct . unpack ( "<iii" , f . read ( 12 ) ) if tag not in ( 0x1234567A , 0x1234567B ) : return None # not a valid tag f . seek ( prepended - ( 12 + cfglen ) ) init = { 'version' : '' , 'target_version' : '' } cfg = configparser . RawConfigParser ( init ) try : part = f . read ( cfglen ) # Read up to the first null byte. config = part . split ( b'\0' , 1 ) [ 0 ] # Now the config is in bytes, but for RawConfigParser, it should #  be text, so decode it. config = config . decode ( sys . getfilesystemencoding ( ) ) cfg . readfp ( six . StringIO ( config ) ) except configparser . Error : return None if not cfg . has_section ( 'metadata' ) or not cfg . has_section ( 'Setup' ) : return None return cfg finally : f . close ( )