summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2013-04-28 15:53:26 (GMT)
committerBrett Cannon <brett@python.org>2013-04-28 15:53:26 (GMT)
commit5a4c233a9e6450919ddea78d7df22a76b4758322 (patch)
treeca34b88be6c69243904e3e3cde0d9e7927d0dc92
parent9330a94467af5b9878ef0fb30da45d964cd735df (diff)
downloadcpython-5a4c233a9e6450919ddea78d7df22a76b4758322.zip
cpython-5a4c233a9e6450919ddea78d7df22a76b4758322.tar.gz
cpython-5a4c233a9e6450919ddea78d7df22a76b4758322.tar.bz2
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.
-rw-r--r--Lib/imp.py14
-rw-r--r--Misc/NEWS3
2 files changed, 15 insertions, 2 deletions
diff --git a/Lib/imp.py b/Lib/imp.py
index 7a7079f..6d156d3 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):
diff --git a/Misc/NEWS b/Misc/NEWS
index 3c9f4a0..6e6ee2c 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -39,6 +39,9 @@ Core and Builtins
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