Merged revisions 76240 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r76240 | antoine.pitrou | 2009-11-13 17:29:04 +0100 (ven., 13 nov. 2009) | 6 lines

  Issue #6551: test_zipimport could import and then destroy some modules of
  the encodings package, which would make other tests fail further down
  the road because the internally cached encoders and decoders would point
  to empty global variables.
........
diff --git a/Lib/test/support.py b/Lib/test/support.py
index 5672a20..18fb391 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -919,6 +919,23 @@
               (module.__name__, t))
     return f, t
 
+
+#=======================================================================
+# Support for saving and restoring the imported modules.
+
+def modules_setup():
+    return sys.modules.copy(),
+
+def modules_cleanup(oldmodules):
+    # Encoders/decoders are registered permanently within the internal
+    # codec cache. If we destroy the corresponding modules their
+    # globals will be set to None which will trip up the cached functions.
+    encodings = [(k, v) for k, v in sys.modules.items()
+                 if k.startswith('encodings.')]
+    sys.modules.clear()
+    sys.modules.update(encodings)
+    sys.modules.update(oldmodules)
+
 #=======================================================================
 # Threading support to prevent reporting refleaks when running regrtest.py -R
 
diff --git a/Lib/test/test_importhooks.py b/Lib/test/test_importhooks.py
index bf2870d..1da30b7 100644
--- a/Lib/test/test_importhooks.py
+++ b/Lib/test/test_importhooks.py
@@ -143,15 +143,14 @@
         self.meta_path = sys.meta_path[:]
         self.path_hooks = sys.path_hooks[:]
         sys.path_importer_cache.clear()
-        self.modules_before = sys.modules.copy()
+        self.modules_before = support.modules_setup()
 
     def tearDown(self):
         sys.path[:] = self.path
         sys.meta_path[:] = self.meta_path
         sys.path_hooks[:] = self.path_hooks
         sys.path_importer_cache.clear()
-        sys.modules.clear()
-        sys.modules.update(self.modules_before)
+        support.modules_cleanup(*self.modules_before)
 
 
 class ImportHooksTestCase(ImportHooksBaseTestCase):
diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py
index 0c568bb..2e293f4 100644
--- a/Lib/test/test_pkg.py
+++ b/Lib/test/test_pkg.py
@@ -48,13 +48,11 @@
         self.root = None
         self.pkgname = None
         self.syspath = list(sys.path)
-        self.sysmodules = sys.modules.copy()
+        self.modules_before = support.modules_setup()
 
     def tearDown(self):
         sys.path[:] = self.syspath
-        sys.modules.clear()
-        sys.modules.update(self.sysmodules)
-        del self.sysmodules
+        support.modules_cleanup(*self.modules_before)
         cleanout(self.root)
 
         # delete all modules concerning the tested hiearchy