mirror of
https://github.com/python/cpython.git
synced 2025-07-29 14:15:07 +00:00
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)
This commit is contained in:
parent
f17a2e4f87
commit
ae21fc6d1f
2 changed files with 11 additions and 8 deletions
|
@ -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):
|
||||||
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):
|
||||||
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"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue