Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python argparse if argument selected then another argument required =True

Is there a way to make an argument required to be true if another specific argument choice is present otherwise argument required is false?

For example the following code if argument -act choice select is 'copy' then the argument dp required is true otherwise required is false:

import argparse

ap = argparse.ArgumentParser()

ap.add_argument("-act", "--act", required=True, choices=['tidy','copy'],type=str.lower,
                help="Action Type")

ap.add_argument("-sp", "--sp", required=True,
                help="Source Path")

args = vars(ap.parse_args())

if args["act"] == 'copy':
    ap.add_argument("-dp", "--dp", required=True,
                help="Destination Path")
else:
    ap.add_argument("-dp", "--dp", required=False,
                help="Destination Path")

args = vars(ap.parse_args())

### Tidy Function
def tidy():
    print("tidy Function")

### Copy Function
def copy():
    print("copy Function")


### Call Functions

if args["act"] == 'tidy':
    tidy()
if args["act"] == 'copy':
    copy()

I am currently getting an error unrecognized arguments: -dp with the above code.

The expected result would be to move on to call function. Thanks

like image 719
rob Avatar asked Oct 20 '25 18:10

rob


1 Answers

I would use ArgumentParser.add_subparsers to define the action type {tidy, copy} and give the command specific arguments. Using a base parser with parents allows you to define arguments that are shared by both (or all) your sub-commands.

import argparse


parser = argparse.ArgumentParser(
    prog='PROG', 
    epilog="See '<command> --help' to read about a specific sub-command."
)

base_parser = argparse.ArgumentParser(add_help=False)
base_parser.add_argument("--sp", required=True, help="source")

subparsers = parser.add_subparsers(dest='act', help='Sub-commands')

A_parser = subparsers.add_parser('copy', help='copy command', parents=[base_parser])
A_parser.add_argument('--dp', required=True, help="dest, required")

B_parser = subparsers.add_parser('tidy', help='tidy command', parents=[base_parser])
B_parser.add_argument('--dp', required=False, help="dest, optional")

args = parser.parse_args()

if args.act == 'copy':
    pass
elif args.act == 'tidy':
    pass

print(args)

Which produces the following help pages, note that instead of needing to use -act the command is given as a positional parameter.

~ python args.py -h
usage: PROG [-h] {tidy,copy} ...

positional arguments:
  {tidy,copy}  Sub-commands
    tidy       tidy command
    copy       copy command

optional arguments:
  -h, --help   show this help message and exit

See '<command> --help' to read about a specific sub-command.
~ python args.py copy -h
usage: PROG copy [-h] --sp SP [--dp DP]

optional arguments:
  -h, --help  show this help message and exit
  --sp SP     source
  --dp DP     dest, optional
~ python args.py tidy -h
usage: PROG tidy [-h] --sp SP --dp DP

optional arguments:
  -h, --help  show this help message and exit
  --sp SP     source
  --dp DP     dest, required
like image 187
Alex Avatar answered Oct 23 '25 08:10

Alex



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!