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
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)