Commit ae21fc6d authored by Nick Coghlan's avatar Nick Coghlan

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)
parent f17a2e4f
...@@ -84,10 +84,13 @@ def run_module(mod_name, init_globals=None, ...@@ -84,10 +84,13 @@ def run_module(mod_name, init_globals=None,
""" """
loader = get_loader(mod_name) loader = get_loader(mod_name)
if loader is None: 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) code = loader.get_code(mod_name)
if code is None: 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) filename = _get_filename(loader, mod_name)
if run_name is None: if run_name is None:
run_name = mod_name run_name = mod_name
......
...@@ -77,12 +77,16 @@ class RunModuleTest(unittest.TestCase): ...@@ -77,12 +77,16 @@ class RunModuleTest(unittest.TestCase):
self.fail("Expected import error for " + mod_name) self.fail("Expected import error for " + mod_name)
def test_invalid_names(self): def test_invalid_names(self):
# Builtin module
self.expect_import_error("sys") self.expect_import_error("sys")
# Non-existent modules
self.expect_import_error("sys.imp.eric") self.expect_import_error("sys.imp.eric")
self.expect_import_error("os.path.half") self.expect_import_error("os.path.half")
self.expect_import_error("a.bee") self.expect_import_error("a.bee")
self.expect_import_error(".howard") self.expect_import_error(".howard")
self.expect_import_error("..eaten") self.expect_import_error("..eaten")
# Package
self.expect_import_error("logging")
def test_library_module(self): def test_library_module(self):
run_module("runpy") run_module("runpy")
...@@ -115,13 +119,9 @@ class RunModuleTest(unittest.TestCase): ...@@ -115,13 +119,9 @@ class RunModuleTest(unittest.TestCase):
return pkg_dir, mod_fname, mod_name return pkg_dir, mod_fname, mod_name
def _del_pkg(self, top, depth, mod_name): def _del_pkg(self, top, depth, mod_name):
for i in range(depth+1): # Don't forget the module itself for entry in list(sys.modules):
parts = mod_name.rsplit(".", i) if entry.startswith("__runpy_pkg__"):
entry = parts[0]
try:
del sys.modules[entry] del sys.modules[entry]
except KeyError, ex:
if verbose: print ex # Persist with cleaning up
if verbose: print " Removed sys.modules entries" if verbose: print " Removed sys.modules entries"
del sys.path[0] del sys.path[0]
if verbose: print " Removed sys.path entry" if verbose: print " Removed sys.path entry"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment