diff -r 74236c8bf064 Lib/argparse.py --- a/Lib/argparse.py Tue Aug 26 01:02:28 2014 +0200 +++ b/Lib/argparse.py Tue Aug 26 14:16:45 2014 +0300 @@ -91,6 +91,7 @@ import textwrap as _textwrap from gettext import gettext as _, ngettext +from zipfile import is_zipfile as _is_zipfile SUPPRESS = '==SUPPRESS==' @@ -1572,6 +1573,24 @@ self._group_actions.remove(action) +def _prog_name(prog): + if prog is not None: + return prog + + mod = _sys.modules['__main__'] + arg0 = _sys.argv[0] + if mod.__package__ is None: + return _os.path.basename(arg0) + + if _is_zipfile(arg0) or _os.path.isdir(arg0): + suffix = arg0 + else: + suffix = '-m %s' % mod.__package__ + + py = _os.path.basename(_sys.executable) + return '%s %s' % (py, suffix) + + class ArgumentParser(_AttributeHolder, _ActionsContainer): """Object for parsing command line strings into Python objects. @@ -1609,11 +1628,7 @@ argument_default=argument_default, conflict_handler=conflict_handler) - # default setting for prog - if prog is None: - prog = _os.path.basename(_sys.argv[0]) - - self.prog = prog + self.prog = _prog_name(prog) self.usage = usage self.epilog = epilog self.formatter_class = formatter_class diff -r 74236c8bf064 Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py Tue Aug 26 01:02:28 2014 +0200 +++ b/Lib/test/test_argparse.py Tue Aug 26 14:16:45 2014 +0300 @@ -15,9 +15,14 @@ from test import support from unittest import mock + +py_exe = os.path.basename(sys.executable) + + class StdIOBuffer(StringIO): pass + class TestCase(unittest.TestCase): def setUp(self): @@ -2223,7 +2228,7 @@ parents = [self.abcd_parent, self.wxyz_parent] parser = ErrorRaisingArgumentParser(parents=parents) parser_help = parser.format_help() - progname = self.main_program + progname = '{} -m test'.format(py_exe) self.assertEqual(parser_help, textwrap.dedent('''\ usage: {}{}[-h] [-b B] [--d D] [--w W] [-y Y] a z @@ -2257,7 +2262,7 @@ ['-y', 'Y', '-z', 'Z']) parser_help = parser.format_help() - progname = self.main_program + progname = '{} -m test'.format(py_exe) self.assertEqual(parser_help, textwrap.dedent('''\ usage: {}{}[-h] [-w W] [-x X] [-y Y | -z Z]