From 5a4c233a9e6450919ddea78d7df22a76b4758322 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Sun, 28 Apr 2013 11:53:26 -0400 Subject: Issue #17358: imp.load_source() and load_compiled() should now return modules which will typically work when reloaded. A hack is used to support these functions as their API allowed them to pass in a file object but then operate as if import had loaded them. Unfortunately the hack kept a reference around for the file object passed in which would be unusable on reload since it had been closed. The solution is to simply use the hack for the initial load but then a proper loader on the module so that imp.reload() at least has a chance to work. --- Lib/imp.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'Lib/imp.py') diff --git a/Lib/imp.py b/Lib/imp.py index 7a7079f71d..6d156d3115 100644 --- a/Lib/imp.py +++ b/Lib/imp.py @@ -111,7 +111,12 @@ def load_source(name, pathname, file=None): 'importlib.machinery.SourceFileLoader(name, pathname).load_module()' ' instead') warnings.warn(msg, DeprecationWarning, 2) - return _LoadSourceCompatibility(name, pathname, file).load_module(name) + _LoadSourceCompatibility(name, pathname, file).load_module(name) + module = sys.modules[name] + # To allow reloading to potentially work, use a non-hacked loader which + # won't rely on a now-closed file object. + module.__loader__ = _bootstrap.SourceFileLoader(name, pathname) + return module class _LoadCompiledCompatibility(_HackedGetData, @@ -125,7 +130,12 @@ def load_compiled(name, pathname, file=None): 'importlib.machinery.SourcelessFileLoader(name, pathname).' 'load_module() instead ') warnings.warn(msg, DeprecationWarning, 2) - return _LoadCompiledCompatibility(name, pathname, file).load_module(name) + _LoadCompiledCompatibility(name, pathname, file).load_module(name) + module = sys.modules[name] + # To allow reloading to potentially work, use a non-hacked loader which + # won't rely on a now-closed file object. + module.__loader__ = _bootstrap.SourcelessFileLoader(name, pathname) + return module def load_package(name, path): -- cgit v1.2.1