Search code examples
pythonargparse

Python argparse with two positional arguments


I am trying to use python3 argparse to get a CLI like below:

python main.py virtual_machine deploy --name "chetan"
python main.py virtual_machine power-on
python main.py image --list

I tried something like this, which is not working:

parser = argparse.ArgumentParser(description="VM Services")

subparsers = parser.add_subparsers(help="Subcommands")

parser.add_argument('virtual_machine', nargs=2, action=TwoPositionalAction, help="Virtual machine operations")
args = parser.parse_args()

if args.virtual_machine[1] == "deploy":
    vm_parser = subparsers.add_parser("deploy", help="Virtual machine deploy")
    vm_parser .add_argument("--name", required=False, help="name of the vm")
    vm_parser .set_defaults(func=two_parser_command)

Output:

python3 main.py virtual_machine deploy
usage: main.py [-h] {} ... virtual_machine virtual_machine
main.py: error: invalid choice: 'virtual_machine' (choose from )

Need help on setting 2 or 1 positional parameter(s) with same parser which will call functions to perform respective operation


Solution

  • This worked.

    parser = argparse.ArgumentParser(description="CLI")
    subparsers = parser.add_subparsers(title="Commands", dest="command")
    
    # Subparser for the 'virtual_machine' command
    vm_parser = subparsers.add_parser("virtual_machine", help="Manage virtual machines")
    vm_subparsers = vm_parser.add_subparsers(title="Subcommands", dest="vm_command")
    
    # Subcommand for deploying a virtual machine
    deploy_parser = vm_subparsers.add_parser("deploy", help="Deploy a virtual machine")
    deploy_parser.add_argument("--name", required=True, help="Name of the virtual machine")
    deploy_parser.set_defaults(func=deploy_virtual_machine)
    
    # Subcommand for powering on a virtual machine
    power_on_parser = vm_subparsers.add_parser("power-on", help="Power on a virtual machine")
    power_on_parser.set_defaults(func=power_on_virtual_machine)
    
    # Subparser for the 'image' command
    image_parser = subparsers.add_parser("image", help="Manage images")
    image_parser.set_defaults(func=list_hypervisor_images)