]> granicus.if.org Git - python/commitdiff
Move setup code from importlib.__init__ to
authorBrett Cannon <brett@python.org>
Wed, 8 Feb 2012 23:50:22 +0000 (18:50 -0500)
committerBrett Cannon <brett@python.org>
Wed, 8 Feb 2012 23:50:22 +0000 (18:50 -0500)
importlib._bootstrap._setup().

Lib/importlib/__init__.py
Lib/importlib/_bootstrap.py

index ec6a96554da0c87edc10fa38094a02417960c64b..940a9a224113b83b258c492955cb8bb47d4a171f 100644 (file)
@@ -22,9 +22,6 @@ __all__ = ['__import__', 'import_module']
 
 from . import _bootstrap
 
-import os
-import re
-import tokenize
 
 # To simplify imports in test code
 _w_long = _bootstrap._w_long
@@ -32,31 +29,10 @@ _r_long = _bootstrap._r_long
 
 
 # Bootstrap help #####################################################
+import imp
+import sys
 
-# Required built-in modules.
-try:
-    import posix as _os
-except ImportError:
-    try:
-        import nt as _os
-    except ImportError:
-        try:
-            import os2 as _os
-        except ImportError:
-            raise ImportError('posix, nt, or os2 module required for importlib')
-_bootstrap._os = _os
-import imp, sys, marshal, _io
-_bootstrap.imp = imp
-_bootstrap.sys = sys
-_bootstrap.marshal = marshal
-_bootstrap._io = _io
-import _warnings
-_bootstrap._warnings = _warnings
-
-
-from os import sep
-# For os.path.join replacement; pull from Include/osdefs.h:SEP .
-_bootstrap.path_sep = sep
+_bootstrap._setup(sys, imp)
 
 
 # Public API #########################################################
index e2dd0869114d123780dd697a20751bfe8bf06a33..e5a9580a3b08da5d02f537650b8e796bf5cde524 100644 (file)
@@ -995,3 +995,47 @@ def __import__(name, globals={}, locals={}, fromlist=[], level=0):
                 except ImportError:
                     pass
         return module
+
+
+def _setup(sys_module, imp_module):
+    """Setup importlib by importing needed built-in modules and injecting them
+    into the global namespace.
+
+    As sys is needed for sys.modules access and imp is needed to load built-in
+    modules those two modules must be explicitly passed in.
+
+    """
+    global imp, sys
+    imp = imp_module
+    sys = sys_module
+
+    for module in (imp, sys):
+        if not hasattr(module, '__loader__'):
+            module.__loader__ = BuiltinImporter
+
+    self_module = sys.modules[__name__]
+    for builtin_name in ('_io', '_warnings', 'builtins', 'marshal'):
+        if builtin_name not in sys.modules:
+            builtin_module = BuiltinImporter.load_module(builtin_name)
+        else:
+            builtin_module = sys.modules[builtin_name]
+        setattr(self_module, builtin_name, builtin_module)
+
+    for builtin_os, path_sep in [('posix', '/'), ('nt', '\\'), ('os2', '\\')]:
+        if builtin_os in sys.modules:
+            os_module = sys.modules[builtin_os]
+            break
+        else:
+            try:
+                os_module = BuiltinImporter.load_module(builtin_os)
+                # TODO: rip out os2 code after 3.3 is released as per PEP 11
+                if builtin_os == 'os2' and 'EMX GCC' in sys.version:
+                    path_sep = '/'
+                break
+            except ImportError:
+                continue
+    else:
+        raise ImportError('importlib requires posix or nt')
+    setattr(self_module, '_os', os_module)
+    setattr(self_module, 'path_sep', path_sep)
+