[Python-checkins] bpo-45183: don't raise an exception when calling zipimport.zipimporter.find_spec() when the zip file is missing and the internal cache has been reset (GH-28435)
brettcannon
webhook-mailer at python.org
Fri Sep 17 19:48:26 EDT 2021
https://github.com/python/cpython/commit/209b7035f714dcc41df054b0b023e0b955d7e1a2
commit: 209b7035f714dcc41df054b0b023e0b955d7e1a2
branch: main
author: Brett Cannon <brett at python.org>
committer: brettcannon <brett at python.org>
date: 2021-09-17T16:48:17-07:00
summary:
bpo-45183: don't raise an exception when calling zipimport.zipimporter.find_spec() when the zip file is missing and the internal cache has been reset (GH-28435)
This can occur when the zip file gets deleted, you call zipimport.zipimporter.invalidate_cache(), and then try to use zipimport.zipimporter.find_spec() (i.e. you left the zip file path on sys.path).
files:
A Misc/NEWS.d/next/Library/2021-09-17-15-58-53.bpo-45183.Vv_vch.rst
M Lib/test/test_zipimport.py
M Lib/zipimport.py
diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py
index 938674fcbd385..486200af70391 100644
--- a/Lib/test/test_zipimport.py
+++ b/Lib/test/test_zipimport.py
@@ -548,8 +548,9 @@ def testInvalidateCaches(self):
# Check that the cached data is removed if the file is deleted
os.remove(TEMP_ZIP)
zi.invalidate_caches()
- self.assertIsNone(zi._files)
+ self.assertFalse(zi._files)
self.assertIsNone(zipimport._zip_directory_cache.get(zi.archive))
+ self.assertIsNone(zi.find_spec("name_does_not_matter"))
def testZipImporterMethodsInSubDirectory(self):
packdir = TESTPACK + os.sep
diff --git a/Lib/zipimport.py b/Lib/zipimport.py
index c55fec6aa1c47..25eaee9c0f291 100644
--- a/Lib/zipimport.py
+++ b/Lib/zipimport.py
@@ -334,7 +334,7 @@ def invalidate_caches(self):
_zip_directory_cache[self.archive] = self._files
except ZipImportError:
_zip_directory_cache.pop(self.archive, None)
- self._files = None
+ self._files = {}
def __repr__(self):
diff --git a/Misc/NEWS.d/next/Library/2021-09-17-15-58-53.bpo-45183.Vv_vch.rst b/Misc/NEWS.d/next/Library/2021-09-17-15-58-53.bpo-45183.Vv_vch.rst
new file mode 100644
index 0000000000000..f3194b34318f4
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-09-17-15-58-53.bpo-45183.Vv_vch.rst
@@ -0,0 +1,3 @@
+Have zipimport.zipimporter.find_spec() not raise an exception when the underlying zip
+file has been deleted and the internal cache has been reset via
+invalidate_cache().
More information about the Python-checkins
mailing list