]> granicus.if.org Git - python/commitdiff
Correctly cleanup sys.modules after executing runpy relative import
authorNick Coghlan <ncoghlan@gmail.com>
Mon, 23 Jul 2007 13:41:45 +0000 (13:41 +0000)
committerNick Coghlan <ncoghlan@gmail.com>
Mon, 23 Jul 2007 13:41:45 +0000 (13:41 +0000)
tests
Restore Python 2.4 ImportError when attempting to execute a package
(as imports cannot be guaranteed to work properly if you try it)

Lib/runpy.py
Lib/test/test_runpy.py

index 8290dfea70a16c8154578abab1cd2d2318410672..d2f18d37e36cb42b4007c1c8dfcea49a9436dc8b 100755 (executable)
@@ -84,10 +84,13 @@ def run_module(mod_name, init_globals=None,
     """
     loader = get_loader(mod_name)
     if loader is None:
-        raise ImportError("No module named " + mod_name)
+        raise ImportError("No module named %s" % mod_name)
+    if loader.is_package(mod_name):
+        raise ImportError(("%s is a package and cannot " +
+                          "be directly executed") % mod_name)
     code = loader.get_code(mod_name)
     if code is None:
-        raise ImportError("No code object available for " + mod_name)
+        raise ImportError("No code object available for %s" % mod_name)
     filename = _get_filename(loader, mod_name)
     if run_name is None:
         run_name = mod_name
index f3bcb0baca9f07e7ace50c241710d77baf1047c1..e4ebc93bd760197c8d8d4578605bc2639cced5d6 100644 (file)
@@ -77,12 +77,16 @@ class RunModuleTest(unittest.TestCase):
             self.fail("Expected import error for " + mod_name)
 
     def test_invalid_names(self):
+        # Builtin module
         self.expect_import_error("sys")
+        # Non-existent modules
         self.expect_import_error("sys.imp.eric")
         self.expect_import_error("os.path.half")
         self.expect_import_error("a.bee")
         self.expect_import_error(".howard")
         self.expect_import_error("..eaten")
+        # Package
+        self.expect_import_error("logging")
 
     def test_library_module(self):
         run_module("runpy")
@@ -115,13 +119,9 @@ class RunModuleTest(unittest.TestCase):
         return pkg_dir, mod_fname, mod_name
 
     def _del_pkg(self, top, depth, mod_name):
-        for i in range(depth+1): # Don't forget the module itself
-            parts = mod_name.rsplit(".", i)
-            entry = parts[0]
-            try:
+        for entry in list(sys.modules):
+            if entry.startswith("__runpy_pkg__"):
                 del sys.modules[entry]
-            except KeyError, ex:
-                if verbose: print ex # Persist with cleaning up
         if verbose: print "  Removed sys.modules entries"
         del sys.path[0]
         if verbose: print "  Removed sys.path entry"