Issue #19205: Don't import the 're' module in site and sysconfig module to
authorChristian Heimes <christian@cheimes.de>
Fri, 11 Oct 2013 22:24:55 +0000 (00:24 +0200)
committerChristian Heimes <christian@cheimes.de>
Fri, 11 Oct 2013 22:24:55 +0000 (00:24 +0200)
to speed up interpreter start.

Lib/site.py
Lib/sysconfig.py
Lib/test/test_site.py
Misc/NEWS

index 4ac2860003e12c5302586c8c981f2d571b84db08..d60f15bc3350ba0197e7f76f78b67b0109800f35 100644 (file)
@@ -70,7 +70,6 @@ ImportError exception, it is silently ignored.
 
 import sys
 import os
-import re
 import builtins
 import _sitebuiltins
 
@@ -436,8 +435,7 @@ def aliasmbcs():
                 encodings._cache[enc] = encodings._unknown
                 encodings.aliases.aliases[enc] = 'mbcs'
 
-
-CONFIG_LINE = re.compile(r'^(?P<key>(\w|[-_])+)\s*=\s*(?P<value>.*)\s*$')
+CONFIG_LINE = r'^(?P<key>(\w|[-_])+)\s*=\s*(?P<value>.*)\s*$'
 
 def venv(known_paths):
     global PREFIXES, ENABLE_USER_SITE
@@ -460,6 +458,8 @@ def venv(known_paths):
         ]
 
     if candidate_confs:
+        import re
+        config_line = re.compile(CONFIG_LINE)
         virtual_conf = candidate_confs[0]
         system_site = "true"
         with open(virtual_conf) as f:
index ee38a20daa2dfd36335cedacea822956de276e20..efc9a8407875a2fbb2d044ec018a7b9d9476fb7e 100644 (file)
@@ -1,7 +1,6 @@
 """Access to Python's configuration information."""
 
 import os
-import re
 import sys
 from os.path import pardir, realpath
 
@@ -222,6 +221,7 @@ def _parse_makefile(filename, vars=None):
     """
     # Regexes needed for parsing Makefile (and similar syntaxes,
     # like old-style Setup files).
+    import re
     _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
     _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
     _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
@@ -435,6 +435,7 @@ def parse_config_h(fp, vars=None):
     """
     if vars is None:
         vars = {}
+    import re
     define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
     undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
 
@@ -658,6 +659,7 @@ def get_platform():
         return "%s-%s.%s" % (osname, version, release)
     elif osname[:6] == "cygwin":
         osname = "cygwin"
+        import re
         rel_re = re.compile(r'[\d.]+')
         m = rel_re.match(release)
         if m:
index 575d65b9f552f18b7eb6add1c5ac0a1e21f5ca90..41fa7b18578cf219b694ca17865a20ac6007f408 100644 (file)
@@ -420,5 +420,20 @@ class ImportSideEffectTests(unittest.TestCase):
         self.assertEqual(code, 200, msg="Can't find " + url)
 
 
+class StartupImportTests(unittest.TestCase):
+
+    def test_startup_imports(self):
+        # This tests checks which modules are loaded by Python when it
+        # initially starts upon startup.
+        args = [sys.executable, '-I', '-c',
+                'import sys; print(set(sys.modules))']
+        stdout = subprocess.check_output(args)
+        modules = eval(stdout.decode('utf-8'))
+        self.assertIn('site', modules)
+
+        re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'}
+        self.assertFalse(modules.intersection(re_mods))
+
+
 if __name__ == "__main__":
     unittest.main()
index 18df7bd955e1806ed0d4cf31f0c0fa2df5af3ef7..c520bbe6365ff81884d69cf0b0b1c832728c2f20 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -36,6 +36,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #19205: Don't import the 're' module in site and sysconfig module to
+  to speed up interpreter start.
+
 - Issue #9548: Add a minimal "_bootlocale" module that is imported by the
   _io module instead of the full locale module.