grit: use print_function everywhere

Migrate all print statements to functions, and have all modules import
the print_function future even if they aren't using print directly.
This will help keep bad print statements from slipping back in.

Bug: 983071
Test: `./grit/test_suite_all.py` passes
Change-Id: I818d2b69c1280ad0f0f7ef02acea8a68444920d3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1698162
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/master@{#676480}
diff --git a/tools/grit/grit.py b/tools/grit/grit.py
index d8074e4..98b99bb 100755
--- a/tools/grit/grit.py
+++ b/tools/grit/grit.py
@@ -6,6 +6,8 @@
 '''Bootstrapping for GRIT.
 '''
 
+from __future__ import print_function
+
 import sys
 
 import grit.grit_runner
diff --git a/tools/grit/grit/clique.py b/tools/grit/grit/clique.py
index f5549d8..cd5b44c 100644
--- a/tools/grit/grit/clique.py
+++ b/tools/grit/grit/clique.py
@@ -6,6 +6,8 @@
 collections of cliques (uber-cliques).
 '''
 
+from __future__ import print_function
+
 import re
 import types
 
@@ -206,10 +208,12 @@
     '''
     def Callback(id, structure):
       if id not in self.cliques_:
-        if debug: print "Ignoring translation #%s" % id
+        if debug:
+          print("Ignoring translation #%s" % id)
         return
 
-      if debug: print "Adding translation #%s" % id
+      if debug:
+        print("Adding translation #%s" % id)
 
       # We fetch placeholder information from the original message (the XTB file
       # only contains placeholder names).
@@ -468,8 +472,8 @@
 
     original = self.MessageForLanguage(self.source_language, False)
     if len(original.GetPlaceholders()) != len(translation.GetPlaceholders()):
-      print ("ERROR: '%s' translation of message id %s does not match" %
-             (language, translation.GetId()))
+      print("ERROR: '%s' translation of message id %s does not match" %
+            (language, translation.GetId()))
       assert False
 
     transl_msg = tclib.Translation(id=self.GetId(),
@@ -478,7 +482,7 @@
 
     if (self.custom_type and
         not self.custom_type.ValidateAndModify(language, transl_msg)):
-      print "WARNING: %s translation failed validation: %s" % (
-        language, transl_msg.GetId())
+      print("WARNING: %s translation failed validation: %s" %
+            (language, transl_msg.GetId()))
 
     self.clique[language] = transl_msg
diff --git a/tools/grit/grit/clique_unittest.py b/tools/grit/grit/clique_unittest.py
index ff2c3a3..99f3f11 100755
--- a/tools/grit/grit/clique_unittest.py
+++ b/tools/grit/grit/clique_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grit.clique'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/constants.py b/tools/grit/grit/constants.py
index 02f2928..3a05c11 100644
--- a/tools/grit/grit/constants.py
+++ b/tools/grit/grit/constants.py
@@ -5,6 +5,7 @@
 '''Constant definitions for GRIT.
 '''
 
+from __future__ import print_function
 
 # This is the Icelandic noun meaning "grit" and is used to check that our
 # input files are in the correct encoding.  The middle character gets encoded
diff --git a/tools/grit/grit/exception.py b/tools/grit/grit/exception.py
index 1a1bed34..ad7f087 100644
--- a/tools/grit/grit/exception.py
+++ b/tools/grit/grit/exception.py
@@ -5,6 +5,8 @@
 '''Exception types for GRIT.
 '''
 
+from __future__ import print_function
+
 class Base(Exception):
   '''A base exception that uses the class's docstring in addition to any
   user-provided message as the body of the Base.
diff --git a/tools/grit/grit/extern/BogoFP.py b/tools/grit/grit/extern/BogoFP.py
index 5af21fd..fc90145 100644
--- a/tools/grit/grit/extern/BogoFP.py
+++ b/tools/grit/grit/extern/BogoFP.py
@@ -9,6 +9,7 @@
     grit.py -h grit.extern.BogoFP xmb /tmp/foo
 """
 
+from __future__ import print_function
 
 import grit.extern.FP
 
diff --git a/tools/grit/grit/extern/FP.py b/tools/grit/grit/extern/FP.py
index 0932f75..f4ec4d9 100644
--- a/tools/grit/grit/extern/FP.py
+++ b/tools/grit/grit/extern/FP.py
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from __future__ import print_function
+
 try:
   import hashlib
   _new_md5 = hashlib.md5
@@ -14,7 +16,7 @@
 
 Usage:
     from extern import FP
-    print 'Fingerprint is %ld' % FP.FingerPrint('Hello world!')
+    print('Fingerprint is %ld' % FP.FingerPrint('Hello world!'))
 """
 
 
diff --git a/tools/grit/grit/extern/tclib.py b/tools/grit/grit/extern/tclib.py
index bbefd7f..9952a87 100644
--- a/tools/grit/grit/extern/tclib.py
+++ b/tools/grit/grit/extern/tclib.py
@@ -10,6 +10,8 @@
 # for creating Windows .rc and .h files.  These are the only parts needed by
 # the Chrome build process.
 
+from __future__ import print_function
+
 from grit.extern import FP
 
 # This module assumes that within a bundle no two messages can have the
diff --git a/tools/grit/grit/format/android_xml.py b/tools/grit/grit/format/android_xml.py
index 2d878673..c969eae 100644
--- a/tools/grit/grit/format/android_xml.py
+++ b/tools/grit/grit/format/android_xml.py
@@ -59,6 +59,8 @@
   </plurals>
 """
 
+from __future__ import print_function
+
 import os
 import re
 import types
diff --git a/tools/grit/grit/format/android_xml_unittest.py b/tools/grit/grit/format/android_xml_unittest.py
index 6f496b61..1d1a7847 100755
--- a/tools/grit/grit/format/android_xml_unittest.py
+++ b/tools/grit/grit/format/android_xml_unittest.py
@@ -5,6 +5,8 @@
 
 """Unittest for android_xml.py."""
 
+from __future__ import print_function
+
 import os
 import StringIO
 import sys
diff --git a/tools/grit/grit/format/c_format.py b/tools/grit/grit/format/c_format.py
index 6d5d9e6..e944b7f 100644
--- a/tools/grit/grit/format/c_format.py
+++ b/tools/grit/grit/format/c_format.py
@@ -5,6 +5,8 @@
 """Formats as a .C file for compilation.
 """
 
+from __future__ import print_function
+
 import os
 import re
 import types
diff --git a/tools/grit/grit/format/c_format_unittest.py b/tools/grit/grit/format/c_format_unittest.py
index ba1c5c71..dd50788 100755
--- a/tools/grit/grit/format/c_format_unittest.py
+++ b/tools/grit/grit/format/c_format_unittest.py
@@ -6,6 +6,8 @@
 """Unittest for c_format.py.
 """
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/format/chrome_messages_json.py b/tools/grit/grit/format/chrome_messages_json.py
index 43853547..6af08b45 100644
--- a/tools/grit/grit/format/chrome_messages_json.py
+++ b/tools/grit/grit/format/chrome_messages_json.py
@@ -5,6 +5,8 @@
 """Formats as a .json file that can be used to localize Google Chrome
 extensions."""
 
+from __future__ import print_function
+
 from json import JSONEncoder
 import re
 import types
diff --git a/tools/grit/grit/format/chrome_messages_json_unittest.py b/tools/grit/grit/format/chrome_messages_json_unittest.py
index ae9c7a6..87b6588 100755
--- a/tools/grit/grit/format/chrome_messages_json_unittest.py
+++ b/tools/grit/grit/format/chrome_messages_json_unittest.py
@@ -6,6 +6,8 @@
 """Unittest for chrome_messages_json.py.
 """
 
+from __future__ import print_function
+
 import json
 import os
 import sys
diff --git a/tools/grit/grit/format/data_pack.py b/tools/grit/grit/format/data_pack.py
index 80599b9..d54f4aa 100755
--- a/tools/grit/grit/format/data_pack.py
+++ b/tools/grit/grit/format/data_pack.py
@@ -7,6 +7,8 @@
 files.
 """
 
+from __future__ import print_function
+
 import collections
 import exceptions
 import os
@@ -276,7 +278,7 @@
                       if key not in whitelist]
       if not suppress_removed_key_output:
         for key in removed_keys:
-          print 'RePackFromDataPackStrings Removed Key:', key
+          print('RePackFromDataPackStrings Removed Key:', key)
     else:
       resources.update(input_resources)
 
@@ -292,7 +294,7 @@
   WriteDataPack(data, 'datapack1.pak', UTF8)
   data2 = {1000: 'test', 5: 'five'}
   WriteDataPack(data2, 'datapack2.pak', UTF8)
-  print 'wrote datapack1 and datapack2 to current directory.'
+  print('wrote datapack1 and datapack2 to current directory.')
 
 
 if __name__ == '__main__':
diff --git a/tools/grit/grit/format/data_pack_unittest.py b/tools/grit/grit/format/data_pack_unittest.py
index ba36590..4bb60a2 100755
--- a/tools/grit/grit/format/data_pack_unittest.py
+++ b/tools/grit/grit/format/data_pack_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for grit.format.data_pack'''
 
+from __future__ import print_function
 
 import os
 import sys
diff --git a/tools/grit/grit/format/gen_predetermined_ids.py b/tools/grit/grit/format/gen_predetermined_ids.py
index 57a6047..1b585f7 100755
--- a/tools/grit/grit/format/gen_predetermined_ids.py
+++ b/tools/grit/grit/format/gen_predetermined_ids.py
@@ -9,6 +9,8 @@
 a while and its output checked in. See tools/gritsettings/README.md for details.
 """
 
+from __future__ import print_function
+
 import fnmatch
 import os
 import re
@@ -128,7 +130,7 @@
   output_resource_map = GenerateResourceMapping(original_resources,
                                                 ordered_resource_ids)
   for res_id in sorted(output_resource_map.keys()):
-    print "{} {}".format(output_resource_map[res_id], res_id)
+    print(output_resource_map[res_id], res_id)
 
 
 def main(argv):
diff --git a/tools/grit/grit/format/gen_predetermined_ids_unittest.py b/tools/grit/grit/format/gen_predetermined_ids_unittest.py
index 0866147..86820efb 100755
--- a/tools/grit/grit/format/gen_predetermined_ids_unittest.py
+++ b/tools/grit/grit/format/gen_predetermined_ids_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for the gen_predetermined_ids module.'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/format/gzip_string.py b/tools/grit/grit/format/gzip_string.py
index 4f54aac1..4f8bc64 100644
--- a/tools/grit/grit/format/gzip_string.py
+++ b/tools/grit/grit/format/gzip_string.py
@@ -3,6 +3,9 @@
 # found in the LICENSE file.
 """Provides gzip utilities for strings.
 """
+
+from __future__ import print_function
+
 import cStringIO
 import gzip
 import subprocess
diff --git a/tools/grit/grit/format/gzip_string_unittest.py b/tools/grit/grit/format/gzip_string_unittest.py
index a920693..f7e53fd 100755
--- a/tools/grit/grit/format/gzip_string_unittest.py
+++ b/tools/grit/grit/format/gzip_string_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grit.format.gzip_string'''
 
+from __future__ import print_function
+
 import gzip
 import io
 import os
diff --git a/tools/grit/grit/format/html_inline.py b/tools/grit/grit/format/html_inline.py
index 88ad571..7e44da7 100755
--- a/tools/grit/grit/format/html_inline.py
+++ b/tools/grit/grit/format/html_inline.py
@@ -10,6 +10,8 @@
 dependencies. It recursively inlines the included files.
 """
 
+from __future__ import print_function
+
 import os
 import re
 import sys
@@ -587,8 +589,8 @@
 
 def main():
   if len(sys.argv) <= 2:
-    print "Flattens a HTML file by inlining its external resources.\n"
-    print "html_inline.py inputfile outputfile"
+    print("Flattens a HTML file by inlining its external resources.\n")
+    print("html_inline.py inputfile outputfile")
   else:
     InlineToFile(sys.argv[1], sys.argv[2], None)
 
diff --git a/tools/grit/grit/format/html_inline_unittest.py b/tools/grit/grit/format/html_inline_unittest.py
index 96f1e26..37c6339f 100755
--- a/tools/grit/grit/format/html_inline_unittest.py
+++ b/tools/grit/grit/format/html_inline_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for grit.format.html_inline'''
 
+from __future__ import print_function
 
 import os
 import re
diff --git a/tools/grit/grit/format/minifier.py b/tools/grit/grit/format/minifier.py
index a45b5545..011cbea 100644
--- a/tools/grit/grit/format/minifier.py
+++ b/tools/grit/grit/format/minifier.py
@@ -3,6 +3,8 @@
 # found in the LICENSE file.
 """Framework for stripping whitespace and comments from resource files"""
 
+from __future__ import print_function
+
 from os import path
 import subprocess
 import sys
@@ -26,7 +28,7 @@
       stderr=subprocess.PIPE)
   (stdout, stderr) = p.communicate(source)
   if p.returncode != 0:
-    print 'Minification failed for %s' % filename
-    print stderr
+    print('Minification failed for %s' % filename)
+    print(stderr)
     sys.exit(p.returncode)
   return stdout
diff --git a/tools/grit/grit/format/policy_templates_json.py b/tools/grit/grit/format/policy_templates_json.py
index f4531f5..2f9330b 100644
--- a/tools/grit/grit/format/policy_templates_json.py
+++ b/tools/grit/grit/format/policy_templates_json.py
@@ -5,6 +5,8 @@
 """Translates policy_templates.json files.
 """
 
+from __future__ import print_function
+
 from grit.node import structure
 
 
diff --git a/tools/grit/grit/format/policy_templates_json_unittest.py b/tools/grit/grit/format/policy_templates_json_unittest.py
index d3816ad30..64eae1b 100755
--- a/tools/grit/grit/format/policy_templates_json_unittest.py
+++ b/tools/grit/grit/format/policy_templates_json_unittest.py
@@ -7,6 +7,8 @@
 """Unittest for policy_templates_json.py.
 """
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/format/rc.py b/tools/grit/grit/format/rc.py
index e7d716d3..7037278 100644
--- a/tools/grit/grit/format/rc.py
+++ b/tools/grit/grit/format/rc.py
@@ -5,6 +5,8 @@
 '''Support for formatting an RC file for compilation.
 '''
 
+from __future__ import print_function
+
 import os
 import types
 import re
@@ -260,7 +262,7 @@
   if _LANGUAGE_CHARSET_PAIR.has_key(language):
     return _LANGUAGE_CHARSET_PAIR[language]
   if language != 'no-specific-language':
-    print 'Warning:GetLangCharsetPair() found undefined language %s' % language
+    print('Warning:GetLangCharsetPair() found undefined language %s' % language)
   return ''
 
 def GetLangDirectivePair(language):
@@ -271,7 +273,7 @@
   # function should only get called when output is being formatted,
   # and at that point we would not want to get
   # 'no-specific-language' passed as the language.
-  print 'Warning:GetLangDirectivePair() found undefined language %s' % language
+  print('Warning:GetLangDirectivePair() found undefined language %s' % language)
   return 'unknown language: see tools/grit/format/rc.py'
 
 def GetLangIdHex(language):
@@ -280,7 +282,7 @@
     lang_id = '0x' + langcharset[0:4]
     return lang_id
   if language != 'no-specific-language':
-    print 'Warning:GetLangIdHex() found undefined language %s' % language
+    print('Warning:GetLangIdHex() found undefined language %s' % language)
   return ''
 
 
@@ -290,7 +292,7 @@
     charset_decimal = int(langcharset[4:], 16)
     return str(charset_decimal)
   if language != 'no-specific-language':
-    print 'Warning:GetCharsetIdDecimal() found undefined language %s' % language
+    print('Warning:GetCharsetIdDecimal() found undefined language %s' % language)
   return ''
 
 
diff --git a/tools/grit/grit/format/rc_header.py b/tools/grit/grit/format/rc_header.py
index da2f156..5a789fb 100644
--- a/tools/grit/grit/format/rc_header.py
+++ b/tools/grit/grit/format/rc_header.py
@@ -5,6 +5,8 @@
 '''Item formatters for RC headers.
 '''
 
+from __future__ import print_function
+
 from grit.node import message
 
 
diff --git a/tools/grit/grit/format/rc_header_unittest.py b/tools/grit/grit/format/rc_header_unittest.py
index f709f934..ab2d16d 100755
--- a/tools/grit/grit/format/rc_header_unittest.py
+++ b/tools/grit/grit/format/rc_header_unittest.py
@@ -8,6 +8,8 @@
 # GRD samples exceed the 80 character limit.
 # pylint: disable-msg=C6310
 
+from __future__ import print_function
+
 import os
 import sys
 import unittest
diff --git a/tools/grit/grit/format/rc_unittest.py b/tools/grit/grit/format/rc_unittest.py
index 497f315c..43714ad62 100755
--- a/tools/grit/grit/format/rc_unittest.py
+++ b/tools/grit/grit/format/rc_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grit.format.rc'''
 
+from __future__ import print_function
+
 import os
 import re
 import sys
diff --git a/tools/grit/grit/format/resource_map.py b/tools/grit/grit/format/resource_map.py
index c9a73c46..95a8b83 100644
--- a/tools/grit/grit/format/resource_map.py
+++ b/tools/grit/grit/format/resource_map.py
@@ -6,6 +6,8 @@
 resource_map_source files.  A resource map is a mapping between resource names
 (string) and the internal resource ID.'''
 
+from __future__ import print_function
+
 import os
 from functools import partial
 
diff --git a/tools/grit/grit/format/resource_map_unittest.py b/tools/grit/grit/format/resource_map_unittest.py
index cd290a71..ec42319 100755
--- a/tools/grit/grit/format/resource_map_unittest.py
+++ b/tools/grit/grit/format/resource_map_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grit.format.resource_map'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/gather/admin_template.py b/tools/grit/grit/gather/admin_template.py
index 1b8340a..15876b4 100644
--- a/tools/grit/grit/gather/admin_template.py
+++ b/tools/grit/grit/gather/admin_template.py
@@ -5,6 +5,8 @@
 '''Gatherer for administrative template files.
 '''
 
+from __future__ import print_function
+
 import re
 
 from grit.gather import regexp
diff --git a/tools/grit/grit/gather/admin_template_unittest.py b/tools/grit/grit/gather/admin_template_unittest.py
index c63c08f..ff065c3 100755
--- a/tools/grit/grit/gather/admin_template_unittest.py
+++ b/tools/grit/grit/gather/admin_template_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for the admin template gatherer.'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/gather/chrome_html.py b/tools/grit/grit/gather/chrome_html.py
index 5e90980..a0d6c47 100644
--- a/tools/grit/grit/gather/chrome_html.py
+++ b/tools/grit/grit/gather/chrome_html.py
@@ -14,6 +14,8 @@
 referencing all available images.
 """
 
+from __future__ import print_function
+
 import os
 import re
 
diff --git a/tools/grit/grit/gather/chrome_html_unittest.py b/tools/grit/grit/gather/chrome_html_unittest.py
index f21caf3..5406a8c 100755
--- a/tools/grit/grit/gather/chrome_html_unittest.py
+++ b/tools/grit/grit/gather/chrome_html_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for grit.gather.chrome_html'''
 
+from __future__ import print_function
 
 import os
 import re
diff --git a/tools/grit/grit/gather/chrome_scaled_image.py b/tools/grit/grit/gather/chrome_scaled_image.py
index 91116ab..d077274 100644
--- a/tools/grit/grit/gather/chrome_scaled_image.py
+++ b/tools/grit/grit/gather/chrome_scaled_image.py
@@ -5,6 +5,8 @@
 '''Gatherer for <structure type="chrome_scaled_image">.
 '''
 
+from __future__ import print_function
+
 import os
 import struct
 
diff --git a/tools/grit/grit/gather/chrome_scaled_image_unittest.py b/tools/grit/grit/gather/chrome_scaled_image_unittest.py
index 6a6b3a4..cbc5b815 100755
--- a/tools/grit/grit/gather/chrome_scaled_image_unittest.py
+++ b/tools/grit/grit/gather/chrome_scaled_image_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for ChromeScaledImage.'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/gather/interface.py b/tools/grit/grit/gather/interface.py
index 5d3ef1d..6149167 100644
--- a/tools/grit/grit/gather/interface.py
+++ b/tools/grit/grit/gather/interface.py
@@ -5,6 +5,7 @@
 '''Interface for all gatherers.
 '''
 
+from __future__ import print_function
 
 import os.path
 import types
diff --git a/tools/grit/grit/gather/json_loader.py b/tools/grit/grit/gather/json_loader.py
index ca1f435..ee0d932b 100644
--- a/tools/grit/grit/gather/json_loader.py
+++ b/tools/grit/grit/gather/json_loader.py
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from __future__ import print_function
 
 from grit.gather import interface
 
diff --git a/tools/grit/grit/gather/policy_json.py b/tools/grit/grit/gather/policy_json.py
index 6e67212..0aee2c6d 100644
--- a/tools/grit/grit/gather/policy_json.py
+++ b/tools/grit/grit/gather/policy_json.py
@@ -5,6 +5,8 @@
 '''Support for "policy_templates.json" format used by the policy template
 generator as a source for generating ADM,ADMX,etc files.'''
 
+from __future__ import print_function
+
 import json
 import types
 import sys
@@ -275,7 +277,7 @@
 
     self.text_ = self._LoadInputFile()
     if util.IsExtraVerbose():
-      print self.text_
+      print(self.text_)
 
     self.data = eval(self.text_)
 
diff --git a/tools/grit/grit/gather/policy_json_unittest.py b/tools/grit/grit/gather/policy_json_unittest.py
index 187dac1c..b48e7fc 100755
--- a/tools/grit/grit/gather/policy_json_unittest.py
+++ b/tools/grit/grit/gather/policy_json_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grit.gather.policy_json'''
 
+from __future__ import print_function
+
 import json
 import os
 import re
diff --git a/tools/grit/grit/gather/rc.py b/tools/grit/grit/gather/rc.py
index a332758..03135bdd 100644
--- a/tools/grit/grit/gather/rc.py
+++ b/tools/grit/grit/gather/rc.py
@@ -5,6 +5,7 @@
 '''Support for gathering resources from RC files.
 '''
 
+from __future__ import print_function
 
 import re
 
diff --git a/tools/grit/grit/gather/rc_unittest.py b/tools/grit/grit/gather/rc_unittest.py
index c4be35e..949f109 100755
--- a/tools/grit/grit/gather/rc_unittest.py
+++ b/tools/grit/grit/gather/rc_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for grit.gather.rc'''
 
+from __future__ import print_function
 
 import os
 import sys
diff --git a/tools/grit/grit/gather/regexp.py b/tools/grit/grit/gather/regexp.py
index de64c17..d06bf9c 100644
--- a/tools/grit/grit/gather/regexp.py
+++ b/tools/grit/grit/gather/regexp.py
@@ -5,6 +5,8 @@
 '''A baseclass for simple gatherers based on regular expressions.
 '''
 
+from __future__ import print_function
+
 import re
 
 from grit.gather import skeleton_gatherer
diff --git a/tools/grit/grit/gather/skeleton_gatherer.py b/tools/grit/grit/gather/skeleton_gatherer.py
index 564ccce..c6127d11 100644
--- a/tools/grit/grit/gather/skeleton_gatherer.py
+++ b/tools/grit/grit/gather/skeleton_gatherer.py
@@ -6,6 +6,8 @@
 list.
 '''
 
+from __future__ import print_function
+
 import types
 
 from grit.gather import interface
diff --git a/tools/grit/grit/gather/tr_html.py b/tools/grit/grit/gather/tr_html.py
index f0bd132..ba59ff65 100644
--- a/tools/grit/grit/gather/tr_html.py
+++ b/tools/grit/grit/gather/tr_html.py
@@ -6,6 +6,7 @@
 portions.  We wanted to reuse extern.tclib.api.handlers.html.TCHTMLParser
 but this proved impossible due to the fact that the TotalRecall HTML templates
 are in general quite far from parseable HTML and the TCHTMLParser derives
+
 from HTMLParser.HTMLParser which requires relatively well-formed HTML.  Some
 examples of "HTML" from the TotalRecall HTML templates that wouldn't be
 parseable include things like:
@@ -48,6 +49,7 @@
 extern.tclib.api.handlers.html.TCHTMLParser.
 '''
 
+from __future__ import print_function
 
 import re
 import types
@@ -208,7 +210,7 @@
 _DEBUG = 0
 def _DebugPrint(text):
   if _DEBUG:
-    print text.encode('utf-8')
+    print(text.encode('utf-8'))
 
 
 class HtmlChunks(object):
diff --git a/tools/grit/grit/gather/tr_html_unittest.py b/tools/grit/grit/gather/tr_html_unittest.py
index 3400ad6f..bc4cc61 100755
--- a/tools/grit/grit/gather/tr_html_unittest.py
+++ b/tools/grit/grit/gather/tr_html_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for grit.gather.tr_html'''
 
+from __future__ import print_function
 
 import os
 import sys
diff --git a/tools/grit/grit/gather/txt.py b/tools/grit/grit/gather/txt.py
index a2a6cfc..e5c10ab 100644
--- a/tools/grit/grit/gather/txt.py
+++ b/tools/grit/grit/gather/txt.py
@@ -5,6 +5,8 @@
 '''Supports making amessage from a text file.
 '''
 
+from __future__ import print_function
+
 from grit.gather import interface
 from grit import tclib
 
diff --git a/tools/grit/grit/gather/txt_unittest.py b/tools/grit/grit/gather/txt_unittest.py
index 80586526..35150939 100755
--- a/tools/grit/grit/gather/txt_unittest.py
+++ b/tools/grit/grit/gather/txt_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for TxtFile gatherer'''
 
+from __future__ import print_function
 
 import os
 import sys
diff --git a/tools/grit/grit/grd_reader.py b/tools/grit/grit/grd_reader.py
index e0ccdac..200b6d1 100755
--- a/tools/grit/grit/grd_reader.py
+++ b/tools/grit/grit/grd_reader.py
@@ -6,6 +6,8 @@
 '''Class for reading GRD files into memory, without processing them.
 '''
 
+from __future__ import print_function
+
 import os.path
 import types
 import xml.sax
@@ -46,14 +48,14 @@
   def startElement(self, name, attrs):
     if self.ignore_depth or name in self.tags_to_ignore:
       if self.debug and self.ignore_depth == 0:
-        print "Ignoring element %s and its children" % name
+        print("Ignoring element %s and its children" % name)
       self.ignore_depth += 1
       return
 
     if self.debug:
       attr_list = ' '.join('%s="%s"' % kv for kv in attrs.items())
-      print ("Starting parsing of element %s with attributes %r" %
-          (name, attr_list or '(none)'))
+      print("Starting parsing of element %s with attributes %r" %
+            (name, attr_list or '(none)'))
 
     typeattr = attrs.get('type')
     node = mapping.ElementToClass(name, typeattr)()
@@ -98,7 +100,7 @@
         self.source = oldsource
 
     if self.debug:
-      print "End parsing of element %s" % name
+      print("End parsing of element %s" % name)
     self.stack.pop().EndParsing()
 
     if name == self.stop_after:
@@ -202,7 +204,7 @@
     pass
   except:
     if not debug:
-      print "parse exception: run GRIT with the -x flag to debug .grd problems"
+      print("parse exception: run GRIT with the -x flag to debug .grd problems")
     raise
 
   if handler.root.name != 'grit':
@@ -232,4 +234,4 @@
 
 if __name__ == '__main__':
   util.ChangeStdoutEncoding()
-  print unicode(Parse(sys.argv[1]))
+  print(unicode(Parse(sys.argv[1])))
diff --git a/tools/grit/grit/grd_reader_unittest.py b/tools/grit/grit/grd_reader_unittest.py
index 7e98f80..0095355 100755
--- a/tools/grit/grit/grd_reader_unittest.py
+++ b/tools/grit/grit/grd_reader_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grd_reader package'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/grit_runner.py b/tools/grit/grit/grit_runner.py
index 09994da..8f9f175 100755
--- a/tools/grit/grit/grit_runner.py
+++ b/tools/grit/grit/grit_runner.py
@@ -7,6 +7,8 @@
 GRIT tools.
 """
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
@@ -111,7 +113,7 @@
     if not _HIDDEN in info.keys():
       tool_list += '    %-12s %s\n' % (tool, info[_FACTORY]().ShortDescription())
 
-  print """GRIT - the Google Resource and Internationalization Tool
+  print("""GRIT - the Google Resource and Internationalization Tool
 
 Usage: grit [GLOBALOPTIONS] TOOL [args to tool]
 
@@ -139,7 +141,7 @@
 %s
   For more information on how to use a particular tool, and the specific
   arguments you can send to that tool, execute 'grit help TOOL'
-""" % (tool_list)
+""" % (tool_list))
 
 
 class Options(object):
@@ -203,11 +205,11 @@
   try:
     args = options.ReadOptions(args)  # args may be shorter after this
   except getopt.GetoptError as e:
-    print "grit:", str(e)
-    print "Try running 'grit help' for valid options."
+    print("grit:", str(e))
+    print("Try running 'grit help' for valid options.")
     return 1
   if not args:
-    print "No tool provided.  Try running 'grit help' for a list of tools."
+    print("No tool provided.  Try running 'grit help' for a list of tools.")
     return 2
 
   tool = args[0]
@@ -218,29 +220,29 @@
     else:
       tool = args[1]
       if not _GetToolInfo(tool):
-        print "No such tool.  Try running 'grit help' for a list of tools."
+        print("No such tool.  Try running 'grit help' for a list of tools.")
         return 2
 
-      print ("Help for 'grit %s' (for general help, run 'grit help'):\n"
-             % (tool))
+      print("Help for 'grit %s' (for general help, run 'grit help'):\n" %
+            (tool,))
       _GetToolInfo(tool)[_FACTORY]().ShowUsage()
       return 0
   if not _GetToolInfo(tool):
-    print "No such tool.  Try running 'grit help' for a list of tools."
+    print("No such tool.  Try running 'grit help' for a list of tools.")
     return 2
 
   try:
     if _GetToolInfo(tool)[_REQUIRES_INPUT]:
       os.stat(options.input)
   except OSError:
-    print ('Input file %s not found.\n'
-           'To specify a different input file:\n'
-           '  1. Use the GRIT_INPUT environment variable.\n'
-           '  2. Use the -i command-line option.  This overrides '
-           'GRIT_INPUT.\n'
-           '  3. Specify neither GRIT_INPUT or -i and GRIT will try to load '
-           "'resource.grd'\n"
-           '     from the current directory.' % options.input)
+    print('Input file %s not found.\n'
+          'To specify a different input file:\n'
+          '  1. Use the GRIT_INPUT environment variable.\n'
+          '  2. Use the -i command-line option.  This overrides '
+          'GRIT_INPUT.\n'
+          '  3. Specify neither GRIT_INPUT or -i and GRIT will try to load '
+          "'resource.grd'\n"
+          '     from the current directory.' % options.input)
     return 2
 
   if options.hash:
@@ -255,8 +257,8 @@
     else:
       return toolobject.Run(options, args[1:])
   except getopt.GetoptError as e:
-    print "grit: %s: %s" % (tool, str(e))
-    print "Try running 'grit help %s' for valid options." % (tool,)
+    print("grit: %s: %s" % (tool, str(e)))
+    print("Try running 'grit help %s' for valid options." % (tool,))
     return 1
 
 
diff --git a/tools/grit/grit/grit_runner_unittest.py b/tools/grit/grit/grit_runner_unittest.py
index 591eeae..be2c64d 100755
--- a/tools/grit/grit/grit_runner_unittest.py
+++ b/tools/grit/grit/grit_runner_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grit.py'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/lazy_re.py b/tools/grit/grit/lazy_re.py
index ae67d048..5c461e87 100644
--- a/tools/grit/grit/lazy_re.py
+++ b/tools/grit/grit/lazy_re.py
@@ -8,6 +8,8 @@
 time in some cases.
 '''
 
+from __future__ import print_function
+
 import re
 
 
diff --git a/tools/grit/grit/lazy_re_unittest.py b/tools/grit/grit/lazy_re_unittest.py
index 99fe1ec..8488b454 100755
--- a/tools/grit/grit/lazy_re_unittest.py
+++ b/tools/grit/grit/lazy_re_unittest.py
@@ -6,6 +6,8 @@
 '''Unit test for lazy_re.
 '''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/node/base.py b/tools/grit/grit/node/base.py
index bd6b207..ca92a91 100644
--- a/tools/grit/grit/node/base.py
+++ b/tools/grit/grit/node/base.py
@@ -5,6 +5,8 @@
 '''Base types for nodes in a GRIT resource tree.
 '''
 
+from __future__ import print_function
+
 import ast
 import os
 import sys
@@ -54,7 +56,7 @@
 
   def __exit__(self, exc_type, exc_value, traceback):
     if exc_type is not None:
-      print u'Error processing node %s' % unicode(self)
+      print(u'Error processing node %s' % unicode(self))
 
   def __iter__(self):
     '''A preorder iteration through the tree that this node is the root of.'''
diff --git a/tools/grit/grit/node/base_unittest.py b/tools/grit/grit/node/base_unittest.py
index 556c7456..d6dd3c3 100755
--- a/tools/grit/grit/node/base_unittest.py
+++ b/tools/grit/grit/node/base_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for base.Node functionality (as used in various subclasses)'''
 
+from __future__ import print_function
 
 import os
 import sys
diff --git a/tools/grit/grit/node/custom/filename.py b/tools/grit/grit/node/custom/filename.py
index 416eac5..cee18ec2 100644
--- a/tools/grit/grit/node/custom/filename.py
+++ b/tools/grit/grit/node/custom/filename.py
@@ -4,6 +4,8 @@
 
 '''A CustomType for filenames.'''
 
+from __future__ import print_function
+
 from grit import clique
 from grit import lazy_re
 
diff --git a/tools/grit/grit/node/custom/filename_unittest.py b/tools/grit/grit/node/custom/filename_unittest.py
index 9ea8eb9..8e2a6dd 100755
--- a/tools/grit/grit/node/custom/filename_unittest.py
+++ b/tools/grit/grit/node/custom/filename_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for grit.node.custom.filename'''
 
+from __future__ import print_function
 
 import os
 import sys
diff --git a/tools/grit/grit/node/empty.py b/tools/grit/grit/node/empty.py
index b821752..e19d2c4 100644
--- a/tools/grit/grit/node/empty.py
+++ b/tools/grit/grit/node/empty.py
@@ -5,6 +5,7 @@
 '''Container nodes that don't have any logic.
 '''
 
+from __future__ import print_function
 
 from grit.node import base
 from grit.node import include
diff --git a/tools/grit/grit/node/include.py b/tools/grit/grit/node/include.py
index fd517bdd..fcb805b 100644
--- a/tools/grit/grit/node/include.py
+++ b/tools/grit/grit/node/include.py
@@ -5,6 +5,8 @@
 """Handling of the <include> element.
 """
 
+from __future__ import print_function
+
 import os
 
 from grit import exception
diff --git a/tools/grit/grit/node/include_unittest.py b/tools/grit/grit/node/include_unittest.py
index b4dcb8a79..5dc2059 100755
--- a/tools/grit/grit/node/include_unittest.py
+++ b/tools/grit/grit/node/include_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for include.IncludeNode'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/node/mapping.py b/tools/grit/grit/node/mapping.py
index 083f77b..6297f0b 100644
--- a/tools/grit/grit/node/mapping.py
+++ b/tools/grit/grit/node/mapping.py
@@ -6,6 +6,7 @@
 When adding a new node type, you add to this mapping.
 '''
 
+from __future__ import print_function
 
 from grit import exception
 
diff --git a/tools/grit/grit/node/message.py b/tools/grit/grit/node/message.py
index ed065bb..a21c38c 100644
--- a/tools/grit/grit/node/message.py
+++ b/tools/grit/grit/node/message.py
@@ -5,6 +5,8 @@
 '''Handling of the <message> element.
 '''
 
+from __future__ import print_function
+
 import re
 import types
 
@@ -167,7 +169,7 @@
       if isinstance(item, types.StringTypes):
         # Not a <ph> element: fail if any <ph> formatters are detected.
         if _FORMATTERS.search(item):
-          print _BAD_PLACEHOLDER_MSG % (item, self.source)
+          print(_BAD_PLACEHOLDER_MSG % (item, self.source))
           raise exception.PlaceholderNotInsidePhNode
         text += item
       else:
@@ -198,7 +200,7 @@
         # Fail if <ph> special chars remain in cdata.
         if re.search(r'[%\$]', cdata):
           message_id = self.attrs['name'] + ' ' + original;
-          print _INVALID_PH_CHAR_MSG % (message_id, self.source)
+          print(_INVALID_PH_CHAR_MSG % (message_id, self.source))
           raise exception.InvalidCharactersInsidePhNode
 
         # Otherwise, accept this <ph> placeholder.
diff --git a/tools/grit/grit/node/message_unittest.py b/tools/grit/grit/node/message_unittest.py
index 5cf78c12..19fd594c 100755
--- a/tools/grit/grit/node/message_unittest.py
+++ b/tools/grit/grit/node/message_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for grit.node.message'''
 
+from __future__ import print_function
 
 import os
 import sys
diff --git a/tools/grit/grit/node/misc.py b/tools/grit/grit/node/misc.py
index 5d983ee9..f01bf7bf 100644
--- a/tools/grit/grit/node/misc.py
+++ b/tools/grit/grit/node/misc.py
@@ -5,6 +5,8 @@
 """Miscellaneous node types.
 """
 
+from __future__ import print_function
+
 import os.path
 import re
 import sys
@@ -191,8 +193,8 @@
                                        % (id, id_reasons[id], reason))
 
       if id < 101:
-        print ('WARNING: Numeric resource IDs should be greater than 100 to\n'
-               'avoid conflicts with system-defined resource IDs.')
+        print('WARNING: Numeric resource IDs should be greater than 100 to\n'
+              'avoid conflicts with system-defined resource IDs.')
 
       if tid not in predetermined_tids and id in predetermined_ids:
         raise exception.IdRangeOverlap('ID %d overlaps between %s and %s'
@@ -600,12 +602,12 @@
         try:
           id_list = first_ids[filename][node.name]
         except KeyError, e:
-          print '-' * 78
-          print 'Resource id not set for %s (%s)!' % (filename, node.name)
-          print ('Please update %s to include an entry for %s.  See the '
-                 'comments in resource_ids for information on why you need to '
-                 'update that file.' % (first_ids_filename, filename))
-          print '-' * 78
+          print('-' * 78)
+          print('Resource id not set for %s (%s)!' % (filename, node.name))
+          print('Please update %s to include an entry for %s.  See the '
+                'comments in resource_ids for information on why you need to '
+                'update that file.' % (first_ids_filename, filename))
+          print('-' * 78)
           raise e
 
         try:
diff --git a/tools/grit/grit/node/misc_unittest.py b/tools/grit/grit/node/misc_unittest.py
index 30df9fe..6ed63a9 100755
--- a/tools/grit/grit/node/misc_unittest.py
+++ b/tools/grit/grit/node/misc_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for misc.GritNode'''
 
+from __future__ import print_function
 
 import StringIO
 import contextlib
diff --git a/tools/grit/grit/node/node_io.py b/tools/grit/grit/node/node_io.py
index 99423ad1..c67add8 100644
--- a/tools/grit/grit/node/node_io.py
+++ b/tools/grit/grit/node/node_io.py
@@ -5,6 +5,8 @@
 '''The <output> and <file> elements.
 '''
 
+from __future__ import print_function
+
 import os
 
 from grit import xtb_reader
@@ -47,7 +49,7 @@
                               defs=defs,
                               target_platform=target_platform)
     except:
-      print "Exception during parsing of %s" % self.GetInputPath()
+      print("Exception during parsing of %s" % self.GetInputPath())
       raise
     # Translation console uses non-standard language codes 'iw' and 'no' for
     # Hebrew and Norwegian Bokmal instead of 'he' and 'nb' used in Chrome.
diff --git a/tools/grit/grit/node/node_io_unittest.py b/tools/grit/grit/node/node_io_unittest.py
index f82887e..3b2ae3b 100755
--- a/tools/grit/grit/node/node_io_unittest.py
+++ b/tools/grit/grit/node/node_io_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for node_io.FileNode'''
 
+from __future__ import print_function
+
 import StringIO
 import os
 import sys
diff --git a/tools/grit/grit/node/structure.py b/tools/grit/grit/node/structure.py
index 6b795d0..69784f5 100644
--- a/tools/grit/grit/node/structure.py
+++ b/tools/grit/grit/node/structure.py
@@ -5,6 +5,8 @@
 '''The <structure> element.
 '''
 
+from __future__ import print_function
+
 import os
 import platform
 import re
@@ -235,8 +237,8 @@
 
   def RunPreSubstitutionGatherer(self, debug=False):
     if debug:
-      print 'Running gatherer %s for file %s' % (
-          str(type(self.gatherer)), self.GetInputPath())
+      print('Running gatherer %s for file %s' %
+            (type(self.gatherer), self.GetInputPath()))
 
     # Note: Parse() is idempotent, therefore this method is also.
     self.gatherer.Parse()
diff --git a/tools/grit/grit/node/structure_unittest.py b/tools/grit/grit/node/structure_unittest.py
index 683a0626..9160edb 100755
--- a/tools/grit/grit/node/structure_unittest.py
+++ b/tools/grit/grit/node/structure_unittest.py
@@ -6,6 +6,8 @@
 '''Unit tests for <structure> nodes.
 '''
 
+from __future__ import print_function
+
 import os
 import os.path
 import sys
diff --git a/tools/grit/grit/node/variant.py b/tools/grit/grit/node/variant.py
index 7d3a526..ab183f0 100644
--- a/tools/grit/grit/node/variant.py
+++ b/tools/grit/grit/node/variant.py
@@ -5,6 +5,7 @@
 '''The <skeleton> element.
 '''
 
+from __future__ import print_function
 
 from grit.node import base
 
diff --git a/tools/grit/grit/pseudo.py b/tools/grit/grit/pseudo.py
index 23b784d..0434026 100644
--- a/tools/grit/grit/pseudo.py
+++ b/tools/grit/grit/pseudo.py
@@ -21,6 +21,8 @@
 the latin-1 character set which will stress character encoding bugs.
 '''
 
+from __future__ import print_function
+
 from grit import lazy_re
 from grit import tclib
 
diff --git a/tools/grit/grit/pseudo_rtl.py b/tools/grit/grit/pseudo_rtl.py
index f307ea049..2240b57 100644
--- a/tools/grit/grit/pseudo_rtl.py
+++ b/tools/grit/grit/pseudo_rtl.py
@@ -7,6 +7,8 @@
 More info at https://sites.google.com/a/chromium.org/dev/Home/fake-bidi
 '''
 
+from __future__ import print_function
+
 import re
 
 from grit import lazy_re
diff --git a/tools/grit/grit/pseudo_unittest.py b/tools/grit/grit/pseudo_unittest.py
index ecf34ff04..b1d53ff 100755
--- a/tools/grit/grit/pseudo_unittest.py
+++ b/tools/grit/grit/pseudo_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grit.pseudo'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/shortcuts.py b/tools/grit/grit/shortcuts.py
index bae61cc..0db2ce4 100644
--- a/tools/grit/grit/shortcuts.py
+++ b/tools/grit/grit/shortcuts.py
@@ -5,6 +5,8 @@
 '''Stuff to prevent conflicting shortcuts.
 '''
 
+from __future__ import print_function
+
 from grit import lazy_re
 
 
diff --git a/tools/grit/grit/shortcuts_unittest.py b/tools/grit/grit/shortcuts_unittest.py
index ed788e63..4580b2a 100644
--- a/tools/grit/grit/shortcuts_unittest.py
+++ b/tools/grit/grit/shortcuts_unittest.py
@@ -5,6 +5,8 @@
 '''Unit tests for grit.shortcuts
 '''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/tclib.py b/tools/grit/grit/tclib.py
index da8ad32..c73664f 100644
--- a/tools/grit/grit/tclib.py
+++ b/tools/grit/grit/tclib.py
@@ -5,6 +5,7 @@
 '''Adaptation of the extern.tclib classes for our needs.
 '''
 
+from __future__ import print_function
 
 import re
 import types
diff --git a/tools/grit/grit/tclib_unittest.py b/tools/grit/grit/tclib_unittest.py
index 87849c5..94673a2 100755
--- a/tools/grit/grit/tclib_unittest.py
+++ b/tools/grit/grit/tclib_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for grit.tclib'''
 
+from __future__ import print_function
 
 import sys
 import os.path
diff --git a/tools/grit/grit/test_suite_all.py b/tools/grit/grit/test_suite_all.py
index 8d7f76b..6e7727cf 100755
--- a/tools/grit/grit/test_suite_all.py
+++ b/tools/grit/grit/test_suite_all.py
@@ -5,6 +5,8 @@
 
 '''Unit test suite that collects all test cases for GRIT.'''
 
+from __future__ import print_function
+
 import os
 import sys
 
diff --git a/tools/grit/grit/tool/android2grd.py b/tools/grit/grit/tool/android2grd.py
index dd47fda..5ef9204 100644
--- a/tools/grit/grit/tool/android2grd.py
+++ b/tools/grit/grit/tool/android2grd.py
@@ -4,6 +4,7 @@
 
 """The 'grit android2grd' tool."""
 
+from __future__ import print_function
 
 import getopt
 import os.path
@@ -161,8 +162,8 @@
     """
     args = self.ParseOptions(args)
     if len(args) != 1:
-      print ('Tool requires one argument, the path to the Android '
-             'strings.xml resource file to be converted.')
+      print('Tool requires one argument, the path to the Android '
+            'strings.xml resource file to be converted.')
       return 2
     self.SetOptions(opts)
 
@@ -243,12 +244,12 @@
         description = ' '.join(child.data.split())
       elif child.nodeType == Node.ELEMENT_NODE:
         if child.tagName != 'string':
-          print 'Warning: ignoring unknown tag <%s>' % child.tagName
+          print('Warning: ignoring unknown tag <%s>' % child.tagName)
         else:
           translatable = self.IsTranslatable(child)
           raw_name = child.getAttribute('name')
           if not _STRING_NAME.match(raw_name):
-            print 'Error: illegal string name: %s' % raw_name
+            print('Error: illegal string name: %s' % raw_name)
           grd_name = 'IDS_' + raw_name.upper()
           # Transform the <string> node contents into a tclib.Message, taking
           # care to handle whitespace transformations and escaped characters,
@@ -291,14 +292,14 @@
           placeholder_text = self.__FormatPlaceholderText(node)
           placeholder_example = node.getAttribute('example')
           if not placeholder_example:
-            print ('Info: placeholder does not contain an example: %s' %
-                   node.toxml())
+            print('Info: placeholder does not contain an example: %s' %
+                  node.toxml())
             placeholder_example = placeholder_id.upper()
           msg.AppendPlaceholder(tclib.Placeholder(placeholder_id,
               placeholder_text, placeholder_example))
         else:
-          print ('Warning: removing tag <%s> which must be inside a '
-                 'placeholder: %s' % (node.tagName, node.toxml()))
+          print('Warning: removing tag <%s> which must be inside a '
+                'placeholder: %s' % (node.tagName, node.toxml()))
           msg.AppendText(self.__FormatPlaceholderText(node))
 
       # Handle other nodes.
@@ -348,17 +349,17 @@
     output = ''.join(output)
 
     if is_quoted_section:
-      print 'Warning: unbalanced quotes in string: %s' % android_string
+      print('Warning: unbalanced quotes in string: %s' % android_string)
 
     if is_backslash_sequence:
-      print 'Warning: trailing backslash in string: %s' % android_string
+      print('Warning: trailing backslash in string: %s' % android_string)
 
     # Check for format specifiers outside of placeholder tags.
     if not inside_placeholder:
       format_specifier = _FORMAT_SPECIFIER.search(output)
       if format_specifier:
-        print ('Warning: format specifiers are not inside a placeholder '
-               '<xliff:g/> tag: %s' % output)
+        print('Warning: format specifiers are not inside a placeholder '
+              '<xliff:g/> tag: %s' % output)
 
     return output
 
@@ -380,15 +381,15 @@
     declare a string resource along with a programmatic id.
     """
     if not description:
-      print 'Warning: no description for %s' % grd_name
+      print('Warning: no description for %s' % grd_name)
     # Check that we actually fit within the character limit we've specified.
     match = _CHAR_LIMIT.search(description)
     if match:
       char_limit = int(match.group(1))
       msg_content = msg.GetRealContent()
       if len(msg_content) > char_limit:
-        print ('Warning: char-limit for %s is %d, but length is %d: %s' %
-               (grd_name, char_limit, len(msg_content), msg_content))
+        print('Warning: char-limit for %s is %d, but length is %d: %s' %
+              (grd_name, char_limit, len(msg_content), msg_content))
     return message.MessageNode.Construct(parent=messages_node,
                                          name=grd_name,
                                          message=msg,
@@ -476,7 +477,7 @@
     if android_string.hasAttribute('translatable'):
       value = android_string.getAttribute('translatable').lower()
       if value not in ('true', 'false'):
-        print 'Warning: translatable attribute has invalid value: %s' % value
+        print('Warning: translatable attribute has invalid value: %s' % value)
       return value == 'true'
     else:
       return True
diff --git a/tools/grit/grit/tool/android2grd_unittest.py b/tools/grit/grit/tool/android2grd_unittest.py
index 0c7ed54a..802d216 100755
--- a/tools/grit/grit/tool/android2grd_unittest.py
+++ b/tools/grit/grit/tool/android2grd_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grit.tool.android2grd'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/tool/build.py b/tools/grit/grit/tool/build.py
index 89f94f1..fde614d 100644
--- a/tools/grit/grit/tool/build.py
+++ b/tools/grit/grit/tool/build.py
@@ -5,6 +5,8 @@
 '''The 'grit build' tool.
 '''
 
+from __future__ import print_function
+
 import codecs
 import filecmp
 import getopt
@@ -210,7 +212,7 @@
         sys.exit(0)
 
     if len(args):
-      print 'This tool takes no tool-specific arguments.'
+      print('This tool takes no tool-specific arguments.')
       return 2
     self.SetOptions(opts)
     self.VerboseOut('Output directory: %s (absolute path: %s)\n' %
@@ -401,7 +403,7 @@
     warnings = shortcuts.GenerateDuplicateShortcutsWarnings(
         self.res.UberClique(), self.res.GetTcProject())
     if warnings:
-      print '\n'.join(warnings)
+      print('\n'.join(warnings))
 
     # Print out any fallback warnings, and missing translation errors, and
     # exit with an error code if there are missing translations in a non-pseudo
@@ -411,7 +413,7 @@
     if warnings:
       self.VerboseOut(warnings)
     if self.res.UberClique().HasMissingTranslations():
-      print self.res.UberClique().missing_translations_
+      print(self.res.UberClique().missing_translations_)
       sys.exit(-1)
 
 
@@ -442,8 +444,8 @@
 Extra output files:
 %s
 '''
-      print error % ('\n'.join(asserted), '\n'.join(actual), '\n'.join(missing),
-          '\n'.join(extra))
+      print(error % ('\n'.join(asserted), '\n'.join(actual), '\n'.join(missing),
+                     ' \n'.join(extra)))
       return False
     return True
 
diff --git a/tools/grit/grit/tool/build_unittest.py b/tools/grit/grit/tool/build_unittest.py
index 985882c..a4be0876 100755
--- a/tools/grit/grit/tool/build_unittest.py
+++ b/tools/grit/grit/tool/build_unittest.py
@@ -6,6 +6,8 @@
 '''Unit tests for the 'grit build' tool.
 '''
 
+from __future__ import print_function
+
 import codecs
 import os
 import sys
diff --git a/tools/grit/grit/tool/buildinfo.py b/tools/grit/grit/tool/buildinfo.py
index 5ef1a01..845aea9f 100644
--- a/tools/grit/grit/tool/buildinfo.py
+++ b/tools/grit/grit/tool/buildinfo.py
@@ -5,6 +5,8 @@
 """Output the list of files to be generated by GRIT from an input.
 """
 
+from __future__ import print_function
+
 import getopt
 import os
 import sys
@@ -41,7 +43,7 @@
         self.ShowUsage()
         sys.exit(0)
     if len(args) > 0:
-      print 'This tool takes exactly one argument: the output directory via -o'
+      print('This tool takes exactly one argument: the output directory via -o')
       return 2
     self.SetOptions(opts)
 
@@ -64,13 +66,13 @@
             if path:
               path = os.path.join(self.output_directory, path)
               path = os.path.normpath(path)
-              print '%s|%s' % ('rc_all', path)
+              print('%s|%s' % ('rc_all', path))
       res_tree.SetOutputLanguage(old_output_language)
 
     for output in res_tree.GetOutputFiles():
       path = os.path.join(self.output_directory, output.GetFilename())
       path = os.path.normpath(path)
-      print '%s|%s' % (output.GetType(), path)
+      print('%s|%s' % (output.GetType(), path))
 
     for infile in res_tree.GetInputFiles():
-      print 'input|%s' % os.path.normpath(infile)
+      print('input|%s' % os.path.normpath(infile))
diff --git a/tools/grit/grit/tool/buildinfo_unittest.py b/tools/grit/grit/tool/buildinfo_unittest.py
index b07bcd62..e7b086d9 100755
--- a/tools/grit/grit/tool/buildinfo_unittest.py
+++ b/tools/grit/grit/tool/buildinfo_unittest.py
@@ -6,6 +6,8 @@
 """Unit tests for the 'grit buildinfo' tool.
 """
 
+from __future__ import print_function
+
 import os
 import StringIO
 import sys
diff --git a/tools/grit/grit/tool/count.py b/tools/grit/grit/tool/count.py
index 1a45d89..ab37f2d 100644
--- a/tools/grit/grit/tool/count.py
+++ b/tools/grit/grit/tool/count.py
@@ -4,6 +4,8 @@
 
 '''Count number of occurrences of a given message ID.'''
 
+from __future__ import print_function
+
 import getopt
 import sys
 
@@ -32,8 +34,8 @@
   def Run(self, opts, args):
     args = self.ParseOptions(args)
     if len(args) != 1:
-      print ('This tool takes a single tool-specific argument, the message '
-             'ID to count.')
+      print('This tool takes a single tool-specific argument, the message '
+            'ID to count.')
       return 2
     self.SetOptions(opts)
 
@@ -47,4 +49,4 @@
       if c.GetId() == id:
         count += 1
 
-    print "There are %d occurrences of message %s." % (count, id)
+    print("There are %d occurrences of message %s." % (count, id))
diff --git a/tools/grit/grit/tool/diff_structures.py b/tools/grit/grit/tool/diff_structures.py
index 681d01ec..f007d01 100644
--- a/tools/grit/grit/tool/diff_structures.py
+++ b/tools/grit/grit/tool/diff_structures.py
@@ -5,6 +5,8 @@
 '''The 'grit sdiff' tool.
 '''
 
+from __future__ import print_function
+
 import os
 import getopt
 import sys
@@ -67,11 +69,11 @@
         sys.exit(0)
 
     if len(args) != 2:
-      print "Incorrect usage - 'grit help sdiff' for usage details."
+      print("Incorrect usage - 'grit help sdiff' for usage details.")
       return 2
 
     if 'P4DIFF' not in os.environ:
-      print "Environment variable P4DIFF not set; defaulting to 'windiff'."
+      print("Environment variable P4DIFF not set; defaulting to 'windiff'.")
       diff_program = 'windiff'
     else:
       diff_program = os.environ['P4DIFF']
diff --git a/tools/grit/grit/tool/interface.py b/tools/grit/grit/tool/interface.py
index 27fbbb7..e9232052 100644
--- a/tools/grit/grit/tool/interface.py
+++ b/tools/grit/grit/tool/interface.py
@@ -5,6 +5,7 @@
 '''Base class and interface for tools.
 '''
 
+from __future__ import print_function
 
 class Tool(object):
   '''Base class for all tools.  Tools should use their docstring (i.e. the
@@ -40,7 +41,7 @@
 
   def ShowUsage(self):
     '''Show usage text for this tool.'''
-    print self.__doc__
+    print(self.__doc__)
 
   def SetOptions(self, opts):
     self.o = opts
diff --git a/tools/grit/grit/tool/menu_from_parts.py b/tools/grit/grit/tool/menu_from_parts.py
index c8c3619c..b8371ab 100644
--- a/tools/grit/grit/tool/menu_from_parts.py
+++ b/tools/grit/grit/tool/menu_from_parts.py
@@ -4,6 +4,8 @@
 
 '''The 'grit menufromparts' tool.'''
 
+from __future__ import print_function
+
 import types
 
 from grit import grd_reader
@@ -63,7 +65,8 @@
           if isinstance(part, types.StringTypes):
             id = grit.extern.tclib.GenerateMessageId(part)
             if id not in xtb:
-              print "WARNING didn't find all translations for menu %s" % node.attrs['name']
+              print("WARNING didn't find all translations for menu %s" %
+                    (node.attrs['name'],))
               translation = []
               break
             translation.append(xtb[id])
diff --git a/tools/grit/grit/tool/newgrd.py b/tools/grit/grit/tool/newgrd.py
index 385a806..18579596 100644
--- a/tools/grit/grit/tool/newgrd.py
+++ b/tools/grit/grit/tool/newgrd.py
@@ -5,6 +5,8 @@
 '''Tool to create a new, empty .grd file with all the basic sections.
 '''
 
+from __future__ import print_function
+
 import getopt
 import sys
 
@@ -74,9 +76,10 @@
   def Run(self, opts, args):
     args = self.ParseOptions(args)
     if len(args) != 1:
-      print 'This tool requires exactly one argument, the name of the output file.'
+      print('This tool requires exactly one argument, the name of the output '
+            'file.')
       return 2
     filename = args[0]
     with util.WrapOutputStream(open(filename, 'w'), 'utf-8') as out:
       out.write(_FILE_CONTENTS)
-    print "Wrote file %s" % filename
+    print("Wrote file %s" % filename)
diff --git a/tools/grit/grit/tool/postprocess_interface.py b/tools/grit/grit/tool/postprocess_interface.py
index 08566eb..4bb8c5871 100644
--- a/tools/grit/grit/tool/postprocess_interface.py
+++ b/tools/grit/grit/tool/postprocess_interface.py
@@ -5,6 +5,7 @@
 ''' Base class for postprocessing of RC files.
 '''
 
+from __future__ import print_function
 
 class PostProcessor(object):
   ''' Base class for postprocessing of the RC file data before being
diff --git a/tools/grit/grit/tool/postprocess_unittest.py b/tools/grit/grit/tool/postprocess_unittest.py
index 91f02d69..77fe228b 100755
--- a/tools/grit/grit/tool/postprocess_unittest.py
+++ b/tools/grit/grit/tool/postprocess_unittest.py
@@ -8,6 +8,8 @@
    modify the grd data tree, changing the message name attributes.
 '''
 
+from __future__ import print_function
+
 import os
 import re
 import sys
diff --git a/tools/grit/grit/tool/preprocess_interface.py b/tools/grit/grit/tool/preprocess_interface.py
index 97404e9f..67974e7 100644
--- a/tools/grit/grit/tool/preprocess_interface.py
+++ b/tools/grit/grit/tool/preprocess_interface.py
@@ -5,6 +5,7 @@
 ''' Base class for preprocessing of RC files.
 '''
 
+from __future__ import print_function
 
 class PreProcessor(object):
   ''' Base class for preprocessing of the RC file data before being
diff --git a/tools/grit/grit/tool/preprocess_unittest.py b/tools/grit/grit/tool/preprocess_unittest.py
index da4242b..40b95cd 100755
--- a/tools/grit/grit/tool/preprocess_unittest.py
+++ b/tools/grit/grit/tool/preprocess_unittest.py
@@ -8,6 +8,8 @@
    provide the actual rctext data.
 '''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/tool/rc2grd.py b/tools/grit/grit/tool/rc2grd.py
index 4850e824..f11560d5 100644
--- a/tools/grit/grit/tool/rc2grd.py
+++ b/tools/grit/grit/tool/rc2grd.py
@@ -4,6 +4,7 @@
 
 '''The 'grit rc2grd' tool.'''
 
+from __future__ import print_function
 
 import os.path
 import getopt
@@ -189,8 +190,8 @@
   def Run(self, opts, args):
     args = self.ParseOptions(args)
     if len(args) != 1:
-      print ('This tool takes a single tool-specific argument, the path to the\n'
-             '.rc file to process.')
+      print('This tool takes a single tool-specific argument, the path to the\n'
+            '.rc file to process.')
       return 2
     self.SetOptions(opts)
 
@@ -203,7 +204,8 @@
     with util.WrapOutputStream(file(out_path, 'w'), 'utf-8') as outfile:
       outfile.write(grd_text)
 
-    print 'Wrote output file %s.\nPlease check for TODO items in the file.' % out_path
+    print('Wrote output file %s.\nPlease check for TODO items in the file.' %
+          (out_path,))
 
 
   def Process(self, rctext, rc_path):
@@ -411,5 +413,5 @@
 
       return msg
     except:
-      print 'Exception processing message with text "%s"' % text
+      print('Exception processing message with text "%s"' % text)
       raise
diff --git a/tools/grit/grit/tool/rc2grd_unittest.py b/tools/grit/grit/tool/rc2grd_unittest.py
index 0e48f07f..9976df7 100755
--- a/tools/grit/grit/tool/rc2grd_unittest.py
+++ b/tools/grit/grit/tool/rc2grd_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for grit.tool.rc2grd'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/tool/resize.py b/tools/grit/grit/tool/resize.py
index 3891717..d44160d 100644
--- a/tools/grit/grit/tool/resize.py
+++ b/tools/grit/grit/tool/resize.py
@@ -5,6 +5,8 @@
 '''The 'grit resize' tool.
 '''
 
+from __future__ import print_function
+
 import getopt
 import os
 import sys
@@ -253,7 +255,7 @@
       ).replace('[[DIALOG_NAME]]', project_name)
     fname = os.path.join(dir_path, '%s.vcproj' % project_name)
     self.WriteFile(fname, project_text)
-    print "Wrote %s" % fname
+    print("Wrote %s" % fname)
 
     # Create the .rc file
     # Output all <include> nodes since the dialogs might depend on them (e.g.
@@ -277,14 +279,14 @@
 
     fname = os.path.join(dir_path, '%s.rc' % project_name)
     self.WriteFile(fname, rc_text, self.GetEncoding())
-    print "Wrote %s" % fname
+    print("Wrote %s" % fname)
 
     # Create the resource.h file
     header_defines = ''.join(rc_header.FormatDefines(grd))
     header_text = HEADER_TEMPLATE.replace('[[DEFINES]]', header_defines)
     fname = os.path.join(dir_path, 'resource.h')
     self.WriteFile(fname, header_text)
-    print "Wrote %s" % fname
+    print("Wrote %s" % fname)
 
   def WriteFile(self, filename, contents, encoding='cp1252'):
     with open(filename, 'wb') as f:
diff --git a/tools/grit/grit/tool/test.py b/tools/grit/grit/tool/test.py
index 1fcf23c..241a976 100644
--- a/tools/grit/grit/tool/test.py
+++ b/tools/grit/grit/tool/test.py
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from __future__ import print_function
+
 from grit.tool import interface
 
 class TestTool(interface.Tool):
@@ -14,9 +16,9 @@
     return 'A do-nothing tool for testing command-line parsing.'
 
   def Run(self, global_options, my_arguments):
-    print 'NOTE This tool is only for testing the parsing of global options and'
-    print 'tool-specific arguments that it receives.  You may have intended to'
-    print 'run "grit unit" which is the unit-test suite for GRIT.'
-    print 'Options: %s' % repr(global_options)
-    print 'Arguments: %s' % repr(my_arguments)
+    print('NOTE This tool is only for testing the parsing of global options and')
+    print('tool-specific arguments that it receives.  You may have intended to')
+    print('run "grit unit" which is the unit-test suite for GRIT.')
+    print('Options: %s' % repr(global_options))
+    print('Arguments: %s' % repr(my_arguments))
     return 0
diff --git a/tools/grit/grit/tool/transl2tc.py b/tools/grit/grit/tool/transl2tc.py
index d75e2b5c..2302682d 100644
--- a/tools/grit/grit/tool/transl2tc.py
+++ b/tools/grit/grit/tool/transl2tc.py
@@ -5,6 +5,8 @@
 '''The 'grit transl2tc' tool.
 '''
 
+from __future__ import print_function
+
 import sys
 
 from grit import grd_reader
diff --git a/tools/grit/grit/tool/transl2tc_unittest.py b/tools/grit/grit/tool/transl2tc_unittest.py
index db64d10..61f1dad 100755
--- a/tools/grit/grit/tool/transl2tc_unittest.py
+++ b/tools/grit/grit/tool/transl2tc_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for the 'grit transl2tc' tool.'''
 
+from __future__ import print_function
 
 import os
 import sys
diff --git a/tools/grit/grit/tool/unit.py b/tools/grit/grit/tool/unit.py
index c78ae0b9..3b6f45d 100644
--- a/tools/grit/grit/tool/unit.py
+++ b/tools/grit/grit/tool/unit.py
@@ -4,6 +4,8 @@
 
 '''GRIT tool that runs the unit test suite for GRIT.'''
 
+from __future__ import print_function
+
 import getopt
 import sys
 import unittest
@@ -31,7 +33,7 @@
   def Run(self, opts, args):
     args = self.ParseOptions(args)
     if args:
-      print 'This tool takes no arguments.'
+      print('This tool takes no arguments.')
       return 2
 
     return unittest.TextTestRunner(verbosity=2).run(
diff --git a/tools/grit/grit/tool/xmb.py b/tools/grit/grit/tool/xmb.py
index 150652b..c2f5a87 100644
--- a/tools/grit/grit/tool/xmb.py
+++ b/tools/grit/grit/tool/xmb.py
@@ -5,6 +5,8 @@
 """The 'grit xmb' tool.
 """
 
+from __future__ import print_function
+
 import getopt
 import os
 import sys
@@ -192,8 +194,8 @@
         self.ShowUsage()
         sys.exit(0)
     if not len(args) == 1:
-      print ('grit xmb takes exactly one argument, the path to the XMB file '
-             'to output.')
+      print('grit xmb takes exactly one argument, the path to the XMB file '
+            'to output.')
       return 2
 
     xmb_path = args[0]
@@ -208,7 +210,7 @@
         res_tree, output_file, limit_file, limit_is_grd, limit_file_dir)
     if limit_file:
       limit_file.close()
-    print "Wrote %s" % xmb_path
+    print("Wrote %s" % xmb_path)
 
   def Process(self, res_tree, output_file, limit_file=None, limit_is_grd=False,
               dir=None):
diff --git a/tools/grit/grit/tool/xmb_unittest.py b/tools/grit/grit/tool/xmb_unittest.py
index 200ecd9a..2df5951b 100755
--- a/tools/grit/grit/tool/xmb_unittest.py
+++ b/tools/grit/grit/tool/xmb_unittest.py
@@ -5,6 +5,8 @@
 
 '''Unit tests for 'grit xmb' tool.'''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
diff --git a/tools/grit/grit/util.py b/tools/grit/grit/util.py
index d98a0bf..3b8a3db 100644
--- a/tools/grit/grit/util.py
+++ b/tools/grit/grit/util.py
@@ -5,6 +5,8 @@
 '''Utilities used by GRIT.
 '''
 
+from __future__ import print_function
+
 import codecs
 import htmlentitydefs
 import os
@@ -434,7 +436,7 @@
   if lang in _LANG_TO_CODEPAGE:
     return _LANG_TO_CODEPAGE[lang]
   else:
-    print "Not sure which codepage to use for %s, assuming cp1252" % lang
+    print("Not sure which codepage to use for %s, assuming cp1252" % lang)
     return 1252
 
 def NewClassInstance(class_name, class_type):
diff --git a/tools/grit/grit/util_unittest.py b/tools/grit/grit/util_unittest.py
index ecadfa3c..a88a032 100755
--- a/tools/grit/grit/util_unittest.py
+++ b/tools/grit/grit/util_unittest.py
@@ -6,6 +6,8 @@
 '''Unit test that checks some of util functions.
 '''
 
+from __future__ import print_function
+
 import os
 import sys
 if __name__ == '__main__':
@@ -82,7 +84,7 @@
       with open('testfile', 'wb') as f:
         f.write(data)
       if util.ReadFile('testfile', encoding) != expected_result:
-        print (util.ReadFile('testfile', encoding), expected_result)
+        print(util.ReadFile('testfile', encoding), expected_result)
       self.failUnless(util.ReadFile('testfile', encoding) == expected_result)
 
     test_std_newline = '\xEF\xBB\xBFabc\ndef'  # EF BB BF is UTF-8 BOM
diff --git a/tools/grit/grit/xtb_reader.py b/tools/grit/grit/xtb_reader.py
index 8d5f58f..ac2f1eae 100644
--- a/tools/grit/grit/xtb_reader.py
+++ b/tools/grit/grit/xtb_reader.py
@@ -5,6 +5,7 @@
 '''Fast and efficient parser for XTB files.
 '''
 
+from __future__ import print_function
 
 import sys
 import xml.sax
diff --git a/tools/grit/grit/xtb_reader_unittest.py b/tools/grit/grit/xtb_reader_unittest.py
index bab019c..a6d6ad61 100755
--- a/tools/grit/grit/xtb_reader_unittest.py
+++ b/tools/grit/grit/xtb_reader_unittest.py
@@ -5,6 +5,7 @@
 
 '''Unit tests for grit.xtb_reader'''
 
+from __future__ import print_function
 
 import os
 import sys
diff --git a/tools/grit/grit_info.py b/tools/grit/grit_info.py
index 7c57aff..4e08c3b 100755
--- a/tools/grit/grit_info.py
+++ b/tools/grit/grit_info.py
@@ -6,6 +6,8 @@
 '''Tool to determine inputs and outputs of a grit file.
 '''
 
+from __future__ import print_function
+
 import optparse
 import os
 import posixpath
@@ -104,9 +106,9 @@
 
 
 def PrintUsage():
-  print 'USAGE: ./grit_info.py --inputs [-D foo] [-f resource_ids] <grd-file>'
-  print ('       ./grit_info.py --outputs [-D foo] [-f resource_ids] ' +
-      '<out-prefix> <grd-file>')
+  print('USAGE: ./grit_info.py --inputs [-D foo] [-f resource_ids] <grd-file>')
+  print('       ./grit_info.py --outputs [-D foo] [-f resource_ids] ' +
+        '<out-prefix> <grd-file>')
 
 
 def DoMain(argv):
@@ -175,9 +177,9 @@
     result = DoMain(argv[1:])
   except WrongNumberOfArguments, e:
     PrintUsage()
-    print e
+    print(e)
     return 1
-  print result
+  print(result)
   return 0
 
 
diff --git a/tools/grit/pak_util.py b/tools/grit/pak_util.py
index b71a20d..bd38dce1 100755
--- a/tools/grit/pak_util.py
+++ b/tools/grit/pak_util.py
@@ -9,6 +9,8 @@
 https://dev.chromium.org/developers/design-documents/linuxresourcesandlocalizedstrings
 """
 
+from __future__ import print_function
+
 import argparse
 import hashlib
 import os
diff --git a/tools/grit/stamp_grit_sources.py b/tools/grit/stamp_grit_sources.py
index d43d4b8..bc7265c6 100644
--- a/tools/grit/stamp_grit_sources.py
+++ b/tools/grit/stamp_grit_sources.py
@@ -12,6 +12,8 @@
 # Usage:
 #    stamp_grit_sources.py <directory> <stamp-file> <.d-file>
 
+from __future__ import print_function
+
 import os
 import sys
 
@@ -39,7 +41,7 @@
 
 def main(argv):
   if len(argv) != 4:
-    print "Error: expecting 3 args."
+    print("Error: expecting 3 args.")
     return 1
 
   grit_root_dir = sys.argv[1]