@@ -302,33 +302,6 @@ def _module_repr(module):
302
302
return '<module {!r} from {!r}>' .format (name , filename )
303
303
304
304
305
- class _installed_safely :
306
-
307
- def __init__ (self , module ):
308
- self ._module = module
309
- self ._spec = module .__spec__
310
-
311
- def __enter__ (self ):
312
- # This must be done before putting the module in sys.modules
313
- # (otherwise an optimization shortcut in import.c becomes
314
- # wrong)
315
- self ._spec ._initializing = True
316
- sys .modules [self ._spec .name ] = self ._module
317
-
318
- def __exit__ (self , * args ):
319
- try :
320
- spec = self ._spec
321
- if any (arg is not None for arg in args ):
322
- try :
323
- del sys .modules [spec .name ]
324
- except KeyError :
325
- pass
326
- else :
327
- _verbose_message ('import {!r} # {!r}' , spec .name , spec .loader )
328
- finally :
329
- self ._spec ._initializing = False
330
-
331
-
332
305
class ModuleSpec :
333
306
"""The specification for a module, used for loading.
334
307
@@ -614,30 +587,44 @@ def _exec(spec, module):
614
587
if sys .modules .get (name ) is not module :
615
588
msg = 'module {!r} not in sys.modules' .format (name )
616
589
raise ImportError (msg , name = name )
617
- if spec .loader is None :
618
- if spec .submodule_search_locations is None :
619
- raise ImportError ('missing loader' , name = spec .name )
620
- # namespace package
621
- _init_module_attrs (spec , module , override = True )
622
- return module
623
- _init_module_attrs (spec , module , override = True )
624
- if not hasattr (spec .loader , 'exec_module' ):
625
- # (issue19713) Once BuiltinImporter and ExtensionFileLoader
626
- # have exec_module() implemented, we can add a deprecation
627
- # warning here.
628
- spec .loader .load_module (name )
629
- else :
630
- spec .loader .exec_module (module )
631
- return sys .modules [name ]
590
+ try :
591
+ if spec .loader is None :
592
+ if spec .submodule_search_locations is None :
593
+ raise ImportError ('missing loader' , name = spec .name )
594
+ # Namespace package.
595
+ _init_module_attrs (spec , module , override = True )
596
+ else :
597
+ _init_module_attrs (spec , module , override = True )
598
+ if not hasattr (spec .loader , 'exec_module' ):
599
+ # (issue19713) Once BuiltinImporter and ExtensionFileLoader
600
+ # have exec_module() implemented, we can add a deprecation
601
+ # warning here.
602
+ spec .loader .load_module (name )
603
+ else :
604
+ spec .loader .exec_module (module )
605
+ finally :
606
+ # Update the order of insertion into sys.modules for module
607
+ # clean-up at shutdown.
608
+ module = sys .modules .pop (spec .name )
609
+ sys .modules [spec .name ] = module
610
+ return module
632
611
633
612
634
613
def _load_backward_compatible (spec ):
635
614
# (issue19713) Once BuiltinImporter and ExtensionFileLoader
636
615
# have exec_module() implemented, we can add a deprecation
637
616
# warning here.
638
- spec .loader .load_module (spec .name )
617
+ try :
618
+ spec .loader .load_module (spec .name )
619
+ except :
620
+ if spec .name in sys .modules :
621
+ module = sys .modules .pop (spec .name )
622
+ sys .modules [spec .name ] = module
623
+ raise
639
624
# The module must be in sys.modules at this point!
640
- module = sys .modules [spec .name ]
625
+ # Move it to the end of sys.modules.
626
+ module = sys .modules .pop (spec .name )
627
+ sys .modules [spec .name ] = module
641
628
if getattr (module , '__loader__' , None ) is None :
642
629
try :
643
630
module .__loader__ = spec .loader
@@ -663,23 +650,42 @@ def _load_backward_compatible(spec):
663
650
def _load_unlocked (spec ):
664
651
# A helper for direct use by the import system.
665
652
if spec .loader is not None :
666
- # not a namespace package
653
+ # Not a namespace package.
667
654
if not hasattr (spec .loader , 'exec_module' ):
668
655
return _load_backward_compatible (spec )
669
656
670
657
module = module_from_spec (spec )
671
- with _installed_safely (module ):
672
- if spec .loader is None :
673
- if spec .submodule_search_locations is None :
674
- raise ImportError ('missing loader' , name = spec .name )
675
- # A namespace package so do nothing.
676
- else :
677
- spec .loader .exec_module (module )
678
658
679
- # We don't ensure that the import-related module attributes get
680
- # set in the sys.modules replacement case. Such modules are on
681
- # their own.
682
- return sys .modules [spec .name ]
659
+ # This must be done before putting the module in sys.modules
660
+ # (otherwise an optimization shortcut in import.c becomes
661
+ # wrong).
662
+ spec ._initializing = True
663
+ try :
664
+ sys .modules [spec .name ] = module
665
+ try :
666
+ if spec .loader is None :
667
+ if spec .submodule_search_locations is None :
668
+ raise ImportError ('missing loader' , name = spec .name )
669
+ # A namespace package so do nothing.
670
+ else :
671
+ spec .loader .exec_module (module )
672
+ except :
673
+ try :
674
+ del sys .modules [spec .name ]
675
+ except KeyError :
676
+ pass
677
+ raise
678
+ # Move the module to the end of sys.modules.
679
+ # We don't ensure that the import-related module attributes get
680
+ # set in the sys.modules replacement case. Such modules are on
681
+ # their own.
682
+ module = sys .modules .pop (spec .name )
683
+ sys .modules [spec .name ] = module
684
+ _verbose_message ('import {!r} # {!r}' , spec .name , spec .loader )
685
+ finally :
686
+ spec ._initializing = False
687
+
688
+ return module
683
689
684
690
# A method used during testing of _load_unlocked() and by
685
691
# _load_module_shim().
0 commit comments