diff --git a/libc/tools/Android.bp b/libc/tools/Android.bp
index c93e004..bf515ca 100644
--- a/libc/tools/Android.bp
+++ b/libc/tools/Android.bp
@@ -31,13 +31,4 @@
     data: [
         ":all_kernel_uapi_headers",
     ],
-
-    version: {
-        py2: {
-            enabled: true,
-        },
-        py3: {
-            enabled: false,
-        },
-    },
 }
diff --git a/libc/tools/genfunctosyscallnrs.py b/libc/tools/genfunctosyscallnrs.py
index ecfc8ab..26642f9 100755
--- a/libc/tools/genfunctosyscallnrs.py
+++ b/libc/tools/genfunctosyscallnrs.py
@@ -1,60 +1,71 @@
 #!/usr/bin/env python
 
 import argparse
-import collections
 import logging
 import os
 import re
-import subprocess
-import textwrap
 
 from gensyscalls import SupportedArchitectures, SysCallsTxtParser
 from genseccomp import parse_syscall_NRs
 
-def load_syscall_names_from_file(file_path, architecture):
-  parser = SysCallsTxtParser()
-  parser.parse_open_file(open(file_path))
-  arch_map = {}
-  for syscall in parser.syscalls:
-    if syscall.get(architecture):
-      arch_map[syscall["func"]] = syscall["name"];
 
-  return arch_map
+def load_syscall_names_from_file(file_path, architecture):
+    parser = SysCallsTxtParser()
+    parser.parse_open_file(open(file_path))
+    arch_map = {}
+    for syscall in parser.syscalls:
+        if syscall.get(architecture):
+            arch_map[syscall["func"]] = syscall["name"]
+
+    return arch_map
+
 
 def gen_syscall_nrs(out_file, base_syscall_file, syscall_NRs):
-  for arch in SupportedArchitectures:
-    base_names = load_syscall_names_from_file(base_syscall_file, arch)
+    for arch in SupportedArchitectures:
+        base_names = load_syscall_names_from_file(base_syscall_file, arch)
 
-    for func,syscall in base_names.iteritems():
-      out_file.write("#define __" + arch + "_" + func + " " + str(syscall_NRs[arch][syscall]) + ";\n")
+        for func, syscall in base_names.items():
+            out_file.write("#define __" + arch + "_" + func + " " +
+                           str(syscall_NRs[arch][syscall]) + ";\n")
+
 
 def main():
-  parser = argparse.ArgumentParser(
-      description="Generates a mapping of bionic functions to system call numbers per architecture.")
-  parser.add_argument("--verbose", "-v", help="Enables verbose logging.")
-  parser.add_argument("--out-dir",
-                      help="The output directory for the output files")
-  parser.add_argument("base_file", metavar="base-file", type=str,
-                      help="The path of the base syscall list (SYSCALLS.TXT).")
-  parser.add_argument("files", metavar="FILE", type=str, nargs="+",
-                      help=("A syscall name-number mapping file for an architecture.\n"))
-  args = parser.parse_args()
+    parser = argparse.ArgumentParser(
+        description=
+        "Generates a mapping of bionic functions to system call numbers per architecture."
+    )
+    parser.add_argument("--verbose", "-v", help="Enables verbose logging.")
+    parser.add_argument("--out-dir",
+                        help="The output directory for the output files")
+    parser.add_argument(
+        "base_file",
+        metavar="base-file",
+        type=str,
+        help="The path of the base syscall list (SYSCALLS.TXT).")
+    parser.add_argument(
+        "files",
+        metavar="FILE",
+        type=str,
+        nargs="+",
+        help=("A syscall name-number mapping file for an architecture.\n"))
+    args = parser.parse_args()
 
-  if args.verbose:
-    logging.basicConfig(level=logging.DEBUG)
-  else:
-    logging.basicConfig(level=logging.INFO)
+    if args.verbose:
+        logging.basicConfig(level=logging.DEBUG)
+    else:
+        logging.basicConfig(level=logging.INFO)
 
-  syscall_files = []
-  syscall_NRs = {}
-  for filename in args.files:
-    m = re.search(r"libseccomp_gen_syscall_nrs_([^/]+)", filename)
-    syscall_NRs[m.group(1)] = parse_syscall_NRs(filename)
+    syscall_NRs = {}
+    for filename in args.files:
+        m = re.search(r"libseccomp_gen_syscall_nrs_([^/]+)", filename)
+        syscall_NRs[m.group(1)] = parse_syscall_NRs(filename)
 
-  output_path = os.path.join(args.out_dir, "func_to_syscall_nrs.h")
-  with open(output_path, "w") as output_file:
-    gen_syscall_nrs(out_file=output_file,
-             syscall_NRs=syscall_NRs, base_syscall_file=args.base_file)
+    output_path = os.path.join(args.out_dir, "func_to_syscall_nrs.h")
+    with open(output_path, "w") as output_file:
+        gen_syscall_nrs(out_file=output_file,
+                        syscall_NRs=syscall_NRs,
+                        base_syscall_file=args.base_file)
+
 
 if __name__ == "__main__":
-  main()
+    main()
