[Python-checkins] cpython (3.3): Issue #17358: imp.load_source() and load_compiled() should now return

brett.cannon python-checkins at python.org
Sun Apr 28 17:58:45 CEST 2013


http://hg.python.org/cpython/rev/3dcc81c2eef5
changeset:   83541:3dcc81c2eef5
branch:      3.3
parent:      83539:1489e3179614
user:        Brett Cannon <brett at python.org>
date:        Sun Apr 28 11:53:26 2013 -0400
summary:
  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.

files:
  Lib/imp.py |  14 ++++++++++++--
  Misc/NEWS  |   3 +++
  2 files changed, 15 insertions(+), 2 deletions(-)


diff --git a/Lib/imp.py b/Lib/imp.py
--- a/Lib/imp.py
+++ b/Lib/imp.py
@@ -111,7 +111,12 @@
            '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 @@
            '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):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -39,6 +39,9 @@
 Library
 -------
 
+- Issue #17358: Modules loaded by imp.load_source() and load_compiled() (and by
+  extention load_module()) now have a better chance of working when reloaded.
+
 - Issue #17353: Plistlib emitted empty data tags with deeply nested datastructures
 
 - Issue #11714: Use 'with' statements to assure a Semaphore releases a

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list