pydoc.pager(__doc__)
_usage = """\
-usage: pdb.py [-c command] ... [-m module | pyfile] [arg] ...
-
Debug the Python program given by pyfile. Alternatively,
an executable module or package to debug can be specified using
the -m switch.
def main():
- import getopt
-
- opts, args = getopt.getopt(sys.argv[1:], 'mhc:', ['help', 'command='])
-
- if not args:
- print(_usage)
+ import argparse
+
+ parser = argparse.ArgumentParser(prog="pdb",
+ description=_usage,
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ allow_abbrev=False)
+
+ parser.add_argument('-c', '--command', action='append', default=[], metavar='command')
+ group = parser.add_mutually_exclusive_group(required=True)
+ group.add_argument('-m', metavar='module')
+ group.add_argument('pyfile', nargs='?')
+ parser.add_argument('args', nargs="*")
+
+ if len(sys.argv) == 1:
+ # If no arguments were given (python -m pdb), print the whole help message.
+ # Without this check, argparse would only complain about missing required arguments.
+ parser.print_help()
sys.exit(2)
- if any(opt in ['-h', '--help'] for opt, optarg in opts):
- print(_usage)
- sys.exit()
-
- commands = [optarg for opt, optarg in opts if opt in ['-c', '--command']]
+ opts = parser.parse_args()
- module_indicated = any(opt in ['-m'] for opt, optarg in opts)
- cls = _ModuleTarget if module_indicated else _ScriptTarget
- target = cls(args[0])
+ if opts.m:
+ file = opts.m
+ target = _ModuleTarget(file)
+ else:
+ file = opts.pyfile
+ target = _ScriptTarget(file)
target.check()
- sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list
+ sys.argv[:] = [file] + opts.args # Hide "pdb.py" and pdb options from argument list
# Note on saving/restoring sys.argv: it's a good idea when sys.argv was
# modified by the script being debugged. It's a bad idea when it was
# changed by the user from the command line. There is a "restart" command
# which allows explicit specification of command line arguments.
pdb = Pdb()
- pdb.rcLines.extend(commands)
+ pdb.rcLines.extend(opts.command)
while True:
try:
pdb._run(target)