STINNER Victor <vstin...@python.org> added the comment:
I can reproduce the leak with command: ./python -m test -R 3:3 test_leak File 1: --- import unittest import sys from importlib import _bootstrap as BOOTSTRAP def _save_and_remove_module(name, orig_modules): """Helper function to save and remove a module from sys.modules Raise ImportError if the module can't be imported. """ # try to import the module and raise an error if it can't be imported if name not in sys.modules: __import__(name) del sys.modules[name] for modname in list(sys.modules): if modname == name or modname.startswith(name + '.'): orig_modules[modname] = sys.modules[modname] del sys.modules[modname] def _save_and_block_module(name, orig_modules): """Helper function to save and block a module in sys.modules Return True if the module was in sys.modules, False otherwise. """ saved = True try: orig_modules[name] = sys.modules[name] except KeyError: saved = False sys.modules[name] = None return saved def import_fresh_module(): name = 'importlib3' fresh = ('importlib',) blocked = ('_frozen_importlib', '_frozen_importlib_external') orig_modules = {} names_to_remove = [] _save_and_remove_module(name, orig_modules) try: for fresh_name in fresh: _save_and_remove_module(fresh_name, orig_modules) for blocked_name in blocked: if not _save_and_block_module(blocked_name, orig_modules): names_to_remove.append(blocked_name) with BOOTSTRAP._ModuleLockManager(name): spec = BOOTSTRAP._find_spec(name, None) module = BOOTSTRAP.module_from_spec(spec) sys.modules[spec.name] = module spec.loader.exec_module(module) del sys.modules[spec.name] finally: for orig_name, module in orig_modules.items(): sys.modules[orig_name] = module for name_to_remove in names_to_remove: del sys.modules[name_to_remove] class Tests(unittest.TestCase): def test_import_fresh(self): import_fresh_module() --- File 2: Lib/importlib3.py --- import _imp import sys try: import _frozen_importlib as _bootstrap case = 1 except ImportError: case = 2 if case == 2: _bootstrap = type(sys)("_bootstrap") _bootstrap._weakref = sys.modules['_weakref'] class ModuleSpec: @staticmethod def method(): pass spec = ModuleSpec() spec.name = "_weakref" module = _imp.create_builtin(spec) module.__spec__ = spec sys.modules["_weakref"] = module --- ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue40050> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com