Argparse"ArgumentError: argument -h/--help: conflicting option string(s): -h, --help"

PythonArgparse

Python Problem Overview


Recently, I am learning argparse module, Argument error occurred below the code

import argparse
import sys


class ExecuteShell(object):
    def create(self, args):
        """aaaaaaa"""
        print('aaaaaaa')
        return args

    def list(self, args):
        """ccccccc"""
        print('ccccccc')
        return args

    def delete(self, args):
        """ddddddd"""
        print('ddddddd')
        return args


class TestShell(object):
    def get_base_parser(self):
        parser = argparse.ArgumentParser()
        parser.add_argument('-h',
                            '--help',
                            action='store_true',
                            help=argparse.SUPPRESS)

        parser.add_argument('-c', action='store',
                            dest='create_value',
                            help='create a file')

        parser.add_argument('-d', action='store',
                            dest='delete_value',
                            help='delete a file')

        parser.add_argument('-l', action='store',
                            dest='list_value',
                            help='list a dir')

        return parser

    def _find_actions(self, subparsers, actions_module):
        for attr in (action for action in dir(actions_module) if not  action.startswith('__')):
            callback = getattr(actions_module, attr)
            desc = callback.__doc__ or ''
            subparser = subparsers.add_parser(attr, description=desc)
            subparser.add_argument('-h', '--help', action='help',
                                   help=argparse.SUPPRESS)
            self.subcommands[attr] = subparser
            subparser.set_defaults(func=callback)

    def main(self, args):
        parser = self.get_base_parser()
        (options, args) = parser.parse_known_args(args)
        subparsers = parser.add_subparsers(metavar='<subcommand>')
        a = ExecuteShell()
        self.subcommands = {}
        subcommand_parser = self._find_actions(subparsers, a)


if __name__ == "__main__":
    a = TestShell()
    a.main(sys.argv[1:])

Why do I get this error and how can I fix it?

Python Solutions


Solution 1 - Python

argparse adds --help and -h options by default. If you don't want to use the built-in help feature, you need to disable it with:

parser = argparse.ArgumentParser(add_help=False)

See the documentation

Solution 2 - Python

The same error pop-ups in 2 other scenarios:

  1. Repeated code

    parser.add_argument('-h', '--help', action='store_true', help=argparse.SUPPRESS)

    parser.add_argument('-h', '--help', action='store_true', help=argparse.SUPPRESS)

  2. When you execute the code multiple times on the same kernel

I'm leaving it just in case if someone had simillar problem.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionchangzhiView Question on Stackoverflow
Solution 1 - PythonBarmarView Answer on Stackoverflow
Solution 2 - PythonJakub BielanView Answer on Stackoverflow