(lines)
return props
Parse the lines of an os-release file.

        Parameters:

        * lines: Iterable through the lines in the os-release file.
                 Each line must be a unicode string or a UTF-8 encoded byte
                 string.

        Returns:
            A dictionary containing all information items.
Parse the lines of an os-release file.
Parse the lines of an os - release file .
def _parse_os_release_content(lines):
        """
        Parse the lines of an os-release file.

        Parameters:

        * lines: Iterable through the lines in the os-release file.
                 Each line must be a unicode string or a UTF-8 encoded byte
                 string.

        Returns:
            A dictionary containing all information items.
        """
        props = {}
        lexer = shlex.shlex(lines, posix=True)
        lexer.whitespace_split = True

        # The shlex module defines its `wordchars` variable using literals,
        # making it dependent on the encoding of the Python source file.
        # In Python 2.6 and 2.7, the shlex source file is encoded in
        # 'iso-8859-1', and the `wordchars` variable is defined as a byte
        # string. This causes a UnicodeDecodeError to be raised when the
        # parsed content is a unicode object. The following fix resolves that
        # (... but it should be fixed in shlex...):
        if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes):
            lexer.wordchars = lexer.wordchars.decode('iso-8859-1')

        tokens = list(lexer)
        for token in tokens:
            # At this point, all shell-like parsing has been done (i.e.
            # comments processed, quotes and backslash escape sequences
            # processed, multi-line values assembled, trailing newlines
            # stripped, etc.), so the tokens are now either:
            # * variable assignments: var=value
            # * commands or their arguments (not allowed in os-release)
            if '=' in token:
                k, v = token.split('=', 1)
                if isinstance(v, bytes):
                    v = v.decode('utf-8')
                props[k.lower()] = v
            else:
                # Ignore any tokens that are not variable assignments
                pass

        if 'version_codename' in props:
            # os-release added a version_codename field.  Use that in
            # preference to anything else Note that some distros purposefully
            # do not have code names.  They should be setting
            # version_codename=""
            props['codename'] = props['version_codename']
        elif 'ubuntu_codename' in props:
            # Same as above but a non-standard field name used on older Ubuntus
            props['codename'] = props['ubuntu_codename']
        elif 'version' in props:
            # If there is no version_codename, parse it from the version
            codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version'])
            if codename:
                codename = codename.group()
                codename = codename.strip('()')
                codename = codename.strip(',')
                codename = codename.strip()
                # codename appears within paranthese.
                props['codename'] = codename

        return props
def _parse_os_release_content ( lines ) : props = { } lexer = shlex . shlex ( lines , posix = True ) lexer . whitespace_split = True # The shlex module defines its `wordchars` variable using literals, # making it dependent on the encoding of the Python source file. # In Python 2.6 and 2.7, the shlex source file is encoded in # 'iso-8859-1', and the `wordchars` variable is defined as a byte # string. This causes a UnicodeDecodeError to be raised when the # parsed content is a unicode object. The following fix resolves that # (... but it should be fixed in shlex...): if sys . version_info [ 0 ] == 2 and isinstance ( lexer . wordchars , bytes ) : lexer . wordchars = lexer . wordchars . decode ( 'iso-8859-1' ) tokens = list ( lexer ) for token in tokens : # At this point, all shell-like parsing has been done (i.e. # comments processed, quotes and backslash escape sequences # processed, multi-line values assembled, trailing newlines # stripped, etc.), so the tokens are now either: # * variable assignments: var=value # * commands or their arguments (not allowed in os-release) if '=' in token : k , v = token . split ( '=' , 1 ) if isinstance ( v , bytes ) : v = v . decode ( 'utf-8' ) props [ k . lower ( ) ] = v else : # Ignore any tokens that are not variable assignments pass if 'version_codename' in props : # os-release added a version_codename field.  Use that in # preference to anything else Note that some distros purposefully # do not have code names.  They should be setting # version_codename="" props [ 'codename' ] = props [ 'version_codename' ] elif 'ubuntu_codename' in props : # Same as above but a non-standard field name used on older Ubuntus props [ 'codename' ] = props [ 'ubuntu_codename' ] elif 'version' in props : # If there is no version_codename, parse it from the version codename = re . search ( r'(\(\D+\))|,(\s+)?\D+' , props [ 'version' ] ) if codename : codename = codename . group ( ) codename = codename . strip ( '()' ) codename = codename . strip ( ',' ) codename = codename . strip ( ) # codename appears within paranthese. props [ 'codename' ] = codename return props