diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2009-02-08 01:26:34 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2009-02-08 01:26:34 (GMT) |
commit | d39600e69f9782481ffadf1ada1d1da9857489e8 (patch) | |
tree | 0e25465b50a97c08a1fd957f25ebf5fd5a94475a /Lib/runpy.py | |
parent | e0820e2ea7b378993fcbeb82fc33d9558be85abe (diff) | |
download | cpython-d39600e69f9782481ffadf1ada1d1da9857489e8.zip cpython-d39600e69f9782481ffadf1ada1d1da9857489e8.tar.gz cpython-d39600e69f9782481ffadf1ada1d1da9857489e8.tar.bz2 |
Issue 4195: Restore the ability to execute packages with the -m switch (but this time in a way that leaves the import machinery in a valid state). (Original patch by Andi Vajda)
Diffstat (limited to 'Lib/runpy.py')
-rwxr-xr-x | Lib/runpy.py | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/Lib/runpy.py b/Lib/runpy.py index fea6104..f9a29ad 100755 --- a/Lib/runpy.py +++ b/Lib/runpy.py @@ -80,13 +80,19 @@ def _get_module_details(mod_name): if loader is None: 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) + if mod_name == "__main__" or mod_name.endswith(".__main__"): + raise ImportError(("Cannot use package as __main__ module")) + try: + pkg_main_name = mod_name + ".__main__" + return _get_module_details(pkg_main_name) + except ImportError, e: + raise ImportError(("%s; %r is a package and cannot " + + "be directly executed") %(e, mod_name)) code = loader.get_code(mod_name) if code is None: raise ImportError("No code object available for %s" % mod_name) filename = _get_filename(loader, mod_name) - return loader, code, filename + return mod_name, loader, code, filename # XXX ncoghlan: Should this be documented and made public? @@ -101,12 +107,12 @@ def _run_module_as_main(mod_name, set_argv0=True): __loader__ """ try: - loader, code, fname = _get_module_details(mod_name) + mod_name, loader, code, fname = _get_module_details(mod_name) except ImportError as exc: # Try to provide a good error message # for directories, zip files and the -m switch if set_argv0: - # For -m switch, just disply the exception + # For -m switch, just display the exception info = str(exc) else: # For directories/zipfiles, let the user @@ -127,7 +133,7 @@ def run_module(mod_name, init_globals=None, Returns the resulting top level namespace dictionary """ - loader, code, fname = _get_module_details(mod_name) + mod_name, loader, code, fname = _get_module_details(mod_name) if run_name is None: run_name = mod_name pkg_name = mod_name.rpartition('.')[0] |