Skip to content

Commit

Permalink
pythongh-109164: Replace getopt with argparse in pdb (python#109165)
Browse files Browse the repository at this point in the history
Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Co-authored-by: Victor Stinner <vstinner@python.org>
  • Loading branch information
3 people authored Sep 22, 2023
1 parent 3e8fcb7 commit 73ccfa2
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 18 deletions.
44 changes: 26 additions & 18 deletions Lib/pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -2097,34 +2095,44 @@ def help():


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)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:mod:`pdb`: Replace :mod:`getopt` with :mod:`argparse` for parsing command line arguments.

0 comments on commit 73ccfa2

Please sign in to comment.