Arguments in top level parser come before subparsers if it has subparsers

Question:

I have this MRE:

import argparse

parser = argparse.ArgumentParser(description='Bundle a Python application')
parser.add_argument(
    '-o', '--output', metavar='OUTPUT FILE', dest='file_name', type=str,
    default=None)
parser.add_argument(
    '--extensions', '--ext', action='store_const', metavar='EXTENSIONS',
    dest='extensions', const=True, default=False,
    help='Whether to allow the importing of C extensions (not needed if C extensions are optional')

if 0:
    actions_parser = parser.add_subparsers(
        dest='action', metavar='ACTION', help='Action mod should take')
    actions_parser.required = True

    build_parser = actions_parser.add_parser("build")
    build_parser.add_argument(
        dest='root', metavar='PROJECT', type=str, help='Project path',
        nargs='?', default='.')

    get_parser = actions_parser.add_parser("get")
    get_parser.add_argument(
        dest='module', metavar='MODULE', type=str, help='Module to download')

args = parser.parse_args()

If you run this with python test.py --ext, this works as expected.

However, if you change the 0 to a 1, then python test.py foo --ext fails, even though it should work. Why?

Asked By: DrownedSuccess

||

Answers:

As it turns out, all the arguments attached to the main parser must be before any subaction, e.g. python test.py --ext foo.

Answered By: DrownedSuccess
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.