ArgumentParser: Fehlereingaben richtig abfangen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo,
ich will cli Argumente mit argparse bearbeiten. Nun funktioniert der beste Fall ganz gut. Aber wenn ich ein benötigtes Argument weglasse, möchte ich eigentlich eine kontrollierte Fehlermeldung haben und keine Exeption Wenn ich aktuell z.B. --action weg lasse bzw falsch schreibe kommt es zur Fehlermeldung:

Code: Alles auswählen

python -u "check_postgres.py" --host=localhost --dbname=db_name --dbuser=db_user --dbpass=test123 --acerer=test
Traceback (most recent call last):
  File "check_postgres.py", line 29, in <module>
    main()
  File check_postgres.py", line 22, in main
    args = parser.parse_args()
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 1730, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 1762, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 1997, in _parse_known_args
    ', '.join(required_actions))
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 2387, in error
    self.print_usage(_sys.stderr)
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 2357, in print_usage
    self._print_message(self.format_usage(), file)
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 2323, in format_usage
    return formatter.format_help()
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 282, in format_help
    help = self._root_section.format_help()
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 213, in format_help
    item_help = join([func(*args) for func, args in self.items])
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 213, in <listcomp>
    item_help = join([func(*args) for func, args in self.items])
  File "e:\Program Files\Python\Python36\lib\argparse.py", line 333, in _format_usage
    assert ' '.join(opt_parts) == opt_usage
AssertionError

Code: Alles auswählen

def main():

    parser = argparse.ArgumentParser(description="Postgres Monitoring Script")
    parser.add_argument('-H', '--host', metavar='', required=True,
                        help='hostname(s) to connect to; defaults to none (Unix socket)')
    parser.add_argument('-p', '--port', metavar='', required=False,
                        help='port(s) to connect to; defaults to $opt{defaultport}.')
    parser.add_argument('-db', '--dbname', metavar='', required=False,
                        help='database name(s) to connect to; defaults to \'postgres\' or \'template1\'')
    parser.add_argument('-u', '--dbuser', metavar='', required=True,
                        help='database user(s) to connect as; defaults to \'$opt{defaultuser}\'')
    parser.add_argument('--dbpass', metavar='', required=True,
                        help='database password(s); use a .pgpass file instead when possible')
    parser.add_argument('--dbservice', metavar='', required=False,
                        help='service name to use inside of pg_service.conf')
    parser.add_argument('--action', metavar='', required=True,
                        help='monitoring action')

    args = parser.parse_args()

    print("{0} {1} {2} {3} {4} ".format(
        args.host, args.dbname, args.dbuser, args.dbpass, args.action))


if __name__ == '__main__':
    main()
Wie kann ich diese Fehler vernünftig abfangen? Bzw. Was habe ich falsch gemacht? Bisher habe ich dazu nchts vernünftiges gefunden.

VG niesel
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Kann ich nicht nachvollziehen:

Code: Alles auswählen

$ python3 -u test.py --host=localhost --dbname=db_name --dbuser=db_user --dbpass=test123 --acerer=test
usage: test.py [-h] -H  [-p] [-db] -u  --dbpass  [--dbservice] --action
test.py: error: the following arguments are required: --action
Allerdings würde ich sagen Du solltest `required` bei Optionen nicht auf `True` setzen und die ganzen Metavariablen nicht auf die leere Zeichenkette. Optionen heissen so weil sie optional sind. Wenn es nicht optional ist, dann ist es auch keine Option. Dafür sind Argumente da. Und ohne die Metavariablen weiss man bei der generierten Hilfe nicht welche Optionen einen Wert erwarten und welche nicht.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten