Move setup code from importlib.__init__ to

importlib._bootstrap._setup().
This commit is contained in:
Brett Cannon 2012-02-08 18:50:22 -05:00
parent 8490fab4ad
commit 354c26ecd6
2 changed files with 47 additions and 27 deletions

View 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 #########################################################

View 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)