0

I'm very new to using argparse so please excuse any basic mistakes.

I would like to pass at least 1 mandatory argument to a script, but depending on what is passed to this argument I would then like it to require 2 more mandatory arguments.

An example:

./script.py Update         # No additional arguments required
./script.py Open 1 2       # 'Open' requires 2 additional arguments
./script.py Close 1 2      # 'Close' requires 2 additional arguments

Is this possible?

My current argparse code if that helps:

import argparse
...
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    argparse_m_values = [str(x) for x in range(1,3)]
    argparse_m_values.append("All")
    argparse_r_values = [str(x) for x in range(1,4)]
    argparse_r_values.append("All")


    parser.add_argument("c", choices=['Update', 'Open', 'Close'])
    parser.add_argument("m", choices=argparse_m_values)
    parser.add_argument("r", choices=argparse_r_values)

    args = parser.parse_args()

    if args.command == "Update":
        l = task.LoopingCall(Update)
        l.start(1.0)
        reactor.run()
    else:
        Move(args.c,args.m,args.r)

edit from comment

parser.add_argument("command", choices=['Update', 'Open', 'Close']) 
if 'Open' in sys.argv or 'Close' in sys.argv: 
     parser.add_argument("m", choices=argparse_m_values) 
     parser.add_argument("r", choices=argparse_r_values) 
hpaulj
  • 221,503
  • 14
  • 230
  • 353
  • Make your 3 arguments flagged (`optionals`), and do any testing, if needed, after. The alternatives are too complex for a beginner. – hpaulj Jul 13 '22 at 14:42
  • I found this to be the answer in the end (I can't stylise this as it's a comment): parser.add_argument("command", choices=['Update', 'Open', 'Close']) if 'Open' in sys.argv or 'Close' in sys.argv: parser.add_argument("m", choices=argparse_m_values) parser.add_argument("r", choices=argparse_r_values) – olliecampbell Jul 13 '22 at 16:23

0 Answers0