gh-109164: Replace `getopt` with `argparse` in pdb (#109165)

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
Tian Gao 2023-09-22 09:55:48 -07:00 committed by GitHub
parent 3e8fcb7df7
commit 73ccfa28c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 16 deletions

View File

@ -2081,8 +2081,6 @@ def help():
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.
@ -2097,34 +2095,44 @@ To let the script run up to a given line X in the debugged file, use
def main():
import getopt
import argparse
opts, args = getopt.getopt(sys.argv[1:], 'mhc:', ['help', 'command='])
parser = argparse.ArgumentParser(prog="pdb",
description=_usage,
formatter_class=argparse.RawDescriptionHelpFormatter,
allow_abbrev=False)
if not args:
print(_usage)
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()
opts = parser.parse_args()
commands = [optarg for opt, optarg in opts if opt in ['-c', '--command']]
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)

View File

@ -0,0 +1 @@
:mod:`pdb`: Replace :mod:`getopt` with :mod:`argparse` for parsing command line arguments.