https://gitlab.gnome.org/Archive/gconf/-/merge_requests/3

diff --git a/gsettings/gsettings-schema-convert b/gsettings/gsettings-schema-convert
index 913cc83b4d8964ff2373517e4746fb6601a5e895..7087ff12327a53584b70ba6bcc5340595524f8c6 100755
--- a/gsettings/gsettings-schema-convert
+++ b/gsettings/gsettings-schema-convert
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # vim: set ts=4 sw=4 et: coding=UTF-8
 #
 # Copyright (c) 2010, Novell, Inc.
@@ -398,7 +398,7 @@
 
     def _word_to_token(self, word):
         lower = word.lower()
-        if lower and lower in self.allowed_tokens.keys():
+        if lower and lower in list(self.allowed_tokens.keys()):
             return lower
         raise GSettingsSchemaConvertException('\'%s\' is not a valid token.' % lower)
 
@@ -603,7 +603,7 @@
             for line in lines:
                 current_line_nb += 1
                 self.parse_line(line)
-        except GSettingsSchemaConvertException, e:
+        except GSettingsSchemaConvertException as e:
             raise GSettingsSchemaConvertException('%s:%s: %s' % (os.path.basename(self.file), current_line_nb, e))
 
         return self.root
@@ -711,7 +711,7 @@
             schema = self._parse_schema(schema_node)
 
             for (child_schema, child_name) in schema._children:
-                if parent.has_key(child_schema):
+                if child_schema in parent:
                     raise GSettingsSchemaConvertException('Child \'%s\' is declared by two different schemas: \'%s\' and \'%s\'.' % (child_schema, parent[child_schema], schema.id))
                 parent[child_schema] = schema
 
@@ -719,7 +719,7 @@
 
         # now let's move all schemas where they should leave
         for schema in schemas:
-            if parent.has_key(schema.id):
+            if schema.id in parent:
                 parent_schema = parent[schema.id]
 
                 # check that the paths of parent and child are supported by
@@ -1055,31 +1055,31 @@
     (options, args) = parser.parse_args()
 
     if len(args) < 1:
-        print >> sys.stderr, 'Need a filename to work on.'
+        print('Need a filename to work on.', file=sys.stderr)
         return 1
     elif len(args) > 1:
-        print >> sys.stderr, 'Too many arguments.'
+        print('Too many arguments.', file=sys.stderr)
         return 1
 
     if options.simple and options.xml:
-        print >> sys.stderr, 'Too many output formats requested.'
+        print('Too many output formats requested.', file=sys.stderr)
         return 1
 
     if not options.gconf and options.gettext_domain:
-        print >> sys.stderr, 'Default gettext domain can only be specified when converting a gconf schema.'
+        print('Default gettext domain can only be specified when converting a gconf schema.', file=sys.stderr)
         return 1
 
     if not options.gconf and options.schema_id:
-        print >> sys.stderr, 'Default schema ID can only be specified when converting a gconf schema.'
+        print('Default schema ID can only be specified when converting a gconf schema.', file=sys.stderr)
         return 1
 
     if not options.gconf and options.keep_underscores:
-        print >> sys.stderr, 'The --keep-underscores option can only be specified when converting a gconf schema.'
+        print('The --keep-underscores option can only be specified when converting a gconf schema.', file=sys.stderr)
         return 1
 
     argfile = os.path.expanduser(args[0])
     if not os.path.exists(argfile):
-        print >> sys.stderr, '\'%s\' does not exist.' % argfile
+        print('\'%s\' does not exist.' % argfile, file=sys.stderr)
         return 1
 
     if options.output:
@@ -1096,7 +1096,7 @@
             try:
                 parser = GConfSchemaParser(argfile, options.gettext_domain, options.schema_id, options.keep_underscores)
                 schema_root = parser.parse()
-            except SyntaxError, e:
+            except SyntaxError as e:
                 raise GSettingsSchemaConvertException('\'%s\' does not look like a valid gconf schema file: %s' % (argfile, e))
         else:
             # autodetect if file is XML or not
@@ -1105,7 +1105,7 @@
                 schema_root = parser.parse()
                 if not options.simple and not options.xml:
                     options.simple = True
-            except SyntaxError, e:
+            except SyntaxError as e:
                 parser = SimpleSchemaParser(argfile)
                 schema_root = parser.parse()
                 if not options.simple and not options.xml:
@@ -1114,10 +1114,10 @@
         if options.xml:
             node = schema_root.get_xml_node()
             try:
-                output = ET.tostring(node, pretty_print = True)
+                output = ET.tostring(node, pretty_print = True, encoding="unicode")
             except TypeError:
                 # pretty_print only works with lxml
-                output = ET.tostring(node)
+                output = ET.tostring(node, encoding="unicode")
         else:
             output = schema_root.get_simple_string()
 
@@ -1128,14 +1128,14 @@
                 fout = open(options.output, 'w')
                 fout.write(output)
                 fout.close()
-            except GSettingsSchemaConvertException, e:
+            except GSettingsSchemaConvertException as e:
                 fout.close()
                 if os.path.exists(options.output):
                     os.unlink(options.output)
                 raise e
 
-    except GSettingsSchemaConvertException, e:
-        print >> sys.stderr, '%s' % e
+    except GSettingsSchemaConvertException as e:
+        print('%s' % e, file=sys.stderr)
         return 1
 
     return 0
