From: Christian Heimes Date: Fri, 11 Oct 2013 22:24:55 +0000 (+0200) Subject: Issue #19205: Don't import the 're' module in site and sysconfig module to X-Git-Tag: v3.4.0a4~178 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8c9cd5a3d466487c54440a47c8c04959e736aae0;p=thirdparty%2FPython%2Fcpython.git Issue #19205: Don't import the 're' module in site and sysconfig module to to speed up interpreter start. --- diff --git a/Lib/site.py b/Lib/site.py index 4ac2860003e1..d60f15bc3350 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -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(\w|[-_])+)\s*=\s*(?P.*)\s*$') +CONFIG_LINE = r'^(?P(\w|[-_])+)\s*=\s*(?P.*)\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: diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index ee38a20daa2d..efc9a8407875 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -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: diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 575d65b9f552..41fa7b18578c 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -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() diff --git a/Misc/NEWS b/Misc/NEWS index 18df7bd955e1..c520bbe6365f 100644 --- 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.