From: Nick Coghlan Date: Mon, 23 Jul 2007 13:41:45 +0000 (+0000) Subject: Correctly cleanup sys.modules after executing runpy relative import X-Git-Tag: v2.6a1~1551 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae21fc6d1fa52d6c26cca797cf1f88cd45f2f143;p=python Correctly cleanup sys.modules after executing runpy relative import tests Restore Python 2.4 ImportError when attempting to execute a package (as imports cannot be guaranteed to work properly if you try it) --- diff --git a/Lib/runpy.py b/Lib/runpy.py index 8290dfea70..d2f18d37e3 100755 --- a/Lib/runpy.py +++ b/Lib/runpy.py @@ -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 diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py index f3bcb0baca..e4ebc93bd7 100644 --- a/Lib/test/test_runpy.py +++ b/Lib/test/test_runpy.py @@ -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"