diff -r b6d6f3b4b100 Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py Tue Dec 17 22:17:26 2013 +1000 +++ b/Lib/importlib/_bootstrap.py Tue Dec 17 23:26:11 2013 +1000 @@ -718,13 +718,22 @@ def __init__(self, module): self._module = module self._spec = module.__spec__ + parent_name, __, submodule_name = module_name.rpartition('.') + if submodule: + self._parent_module = sys.modules[parent_name] + self._submodle_name = submodule_name + else: + self._parent_module = self._submodule_name = None def __enter__(self): # This must be done before putting the module in sys.modules # (otherwise an optimization shortcut in import.c becomes # wrong) self._spec._initializing = True - sys.modules[self._spec.name] = self._module + module_name = self._spec.name + sys.modules[module_name] = self._module + if self._parent_module: + setattr(self._parent_module, self._submodule_name, self._module) def __exit__(self, *args): try: @@ -734,6 +743,11 @@ del sys.modules[spec.name] except KeyError: pass + if self._parent_module: + try: + delattr(self._parent_module, self._submodule_name) + except AttributeError: + pass else: _verbose_message('import {!r} # {!r}', spec.name, spec.loader) finally: @@ -2148,9 +2162,11 @@ else: module = _SpecMethods(spec)._load_unlocked() if parent: - # Set the module as an attribute on its parent. + # Ensure the module is an attribute on its parent. parent_module = sys.modules[parent] - setattr(parent_module, name.rpartition('.')[2], module) + submodule_name = name.rpartition('.')[2] + if getattr(parent_module, submodule_name, None) is not module: + setattr(parent_module, submodule_name, module) return module