De la documentation Python argparse
https://docs.python.org/3/library/argparse.html#exiting-methods
16.4.5.9. Exiting methods
ArgumentParser.exit(status=0, message=None)
This method terminates the program, exiting with the specified status and, if given, it prints a message before that.
ArgumentParser.error(message)
This method prints a usage message including the message to the standard error and terminates the program with a status code of 2.
Ils ont tous deux obtenir un message
, et le transmettre. error
ajoute usage
et le transmet au exit
. Vous pouvez personnaliser les deux dans un analyseur sous-classé.
Il existe également des exemples d'erreur de capture et de redirection du fichier unittest, test/test_argparse.py
.
Un problème avec l'utilisation d'une enveloppe try/except
est que l'information error
est écrit à sys.stderr
, et non repris dans le sys.exc_info
.
In [117]: try:
parser.parse_args(['ug'])
except:
print('execinfo:',sys.exc_info())
.....:
usage: ipython3 [-h] [--test TEST] [--bar TEST] test test
ipython3: error: the following arguments are required: test
execinfo: (<class 'SystemExit'>, SystemExit(2,), <traceback object at 0xb31fb34c>)
Le numéro de sortie est disponible dans exc_info
, mais pas le message. Une option consiste à rediriger sys.stderr
en même temps que le bloc try/except
.
Voici un exemple de changer la méthode exit
et enveloppant l'appel dans un bloc try:
In [155]:
def altexit(status, msg):
print(status, msg)
raise ValueError(msg)
.....:
In [156]: parser.exit=altexit
In [157]:
try:
parser.parse_args(['--ug','ug','ug'])
except ValueError:
msg = sys.exc_info()[1]
.....:
usage: ipython3 [-h] [--test TEST] [--bar TEST] test test
2 ipython3: error: unrecognized arguments: --ug
In [158]: msg
Out[158]: ValueError('ipython3: error: unrecognized arguments: --ug\n')
Python
me permet de remplacer les méthodes d'objets existants. Je ne recommande pas cela dans le code de production, mais c'est pratique pour essayer des idées. Je capture l'erreur (mon choix de ValueError est arbitraire), et enregistre le message pour un affichage ou un test ultérieur.
Généralement, le type d'erreur (par exemple TypeError, ValueError, etc.) fait partie de l'API publique, mais le texte d'erreur ne l'est pas. Il peut être affiné d'une version de Python à l'autre sans beaucoup de notification. Vous testez donc les détails du message à vos risques et périls.
Oui, que je sais, la question est comment remplacer les erreurs argparse? Parce que quand une option n'est pas reconnue, elle sort automatiquement avec le code d'erreur 0, je veux la remplacer pour que je puisse la changer pour sortir avec le code 1 ... – feeloor
use try except block pour attraper l'erreur et selon l'exception exit avec différents codes ... indice: utilisez des méthodes comme sys.exc_info() afin de détecter le type d'exception .. –