Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Comment empecher l'affichage des messages d'erreur ?

+3 votes

Je voudrais que mes scripts s'arrêtent sans afficher de messages d'erreurs en console, et ce quelles que soit les erreurs.

Edit : Un mode nodebug, en quelque sorte, qui s'appliquerait à l'intégralité des scripts Python, qu'ils contiennent des gestions d’exceptions ou pas, de façon à ce que, s'ils croûtent, je n'ai rien d'autre que le retour du prompt.

Comment dois-je m'y prendre ?

demandé 14-Mar-2015 par 01ivier (138 points)
edité 14-Mar-2015 par 01ivier

5 Réponses

+2 votes
 
Meilleure réponse

En fait tu veux pouvoir lancer python sans qu'il n'affiche rien sur la sortie d'erreur?
Je ferai ça:

$ python mon_script_qui_plante.py 2>/dev/null

sous windows, ça devrait donner un truc du genre (de mémoire):

$ python.exe mon_script_qui_plante.py 2> nul

Ca continuera à afficher la sortie standard. Si tu veux rien voir du tout:

$ python mon_script_qui_plante.py >/dev/null 2>&1

ou

$ python.exe mon_script_qui_plante.py > nul 2>&1

Par contre, je t'avoue que je suis assez sceptique sur l'utilisabilité de tout ça. Comment ton utilisateur va savoir si ça marche ou pas?

répondu 18-Mar-2015 par bulange (618 points)
sélectionné 21-Mar-2015 par 01ivier

Comment ton utilisateur va savoir si ça marche ou pas ?

Ah Ah... l'utilisateur, c'est moi... :-)
J'ai un script qui croûte de temps en temps mais qui fonctionne suffisamment bien pour que je ne m’embarrasse pas à chercher la perfection...
Je m'appuie donc sur le script de Sam&Max qui check les processus pour le relancer quand ça part en sucette...

Mais, le script consistant en grande partie à printer en console, il me fallait absolument dégager les erreurs. Et ta solution convient parfaitement... :-)

+6 votes

Le couple try/except est ton ami sur ce coup.

un peu de lecture:
http://sametmax.com/pourquoi-il-faut-specifier-lexception-quon-gere/

répondu 14-Mar-2015 par ashgan (698 points)

Merci, mais je cherche plutôt un mode nodebug que je pourrais activer ou désactiver sans avoir à toucher aux scripts. Genre un DEBUG = False que je collerais quelque part dans un fichier de conf. Je vais éditer mon message pour que ce soit plus clair.

0 votes

Pour reprendre la réponse de ashgan avec un exemple au cas où t'as la flemme de cliquer sur le lien :

Par exemple, tkinter sur python < 3 s'écrit : Tkinter
tandis que sur python3, il s'appelle tkinter (sans majuscule)
Exemple d'erreur sur python3:

import Tkinter as tk
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'Tkinter'

Voilà le même code mais cette fois universelle pour toutes les versions de python cette fois ! (sans erreur)

try:
...    import Tkinter as tk
... except:
...    import tkinter as tk

Voilou ! plus d'erreur, bon vent ^^

répondu 14-Mar-2015 par boblinux (3,092 points)
+3 votes

ok, c'est plus clair.
tu veux un truc du genre, donc?

>>> import sys
>>> import os
# recup du stderr de base, pour plus tard. on sait jamais
>>> old_stderr = sys.stderr
# hop, on change, on renvoie chez le pote dave
>>> new_stderr = open(os.devnull, 'w')
>>> sys.stderr = new_stderr
>>> print 'Sarah Connor?
>>> print 'Bonjour, monsieur Mais entrez donc'
Bonjour, monsieur Mais entrez donc
# c est marre, dave est un gros lourd, en fait. je reprends la main.
>>> sys.stderr = old_stderr
>>> print 'Sarah Connor?
  File "<stdin>", line 1
    print 'Sarah Connor?
                       ^
SyntaxError: EOL while scanning string literal

apres, reste a jouer sur le sys.stderr quand tu veux (ou pas) afficher les erreurs.

chez ap.....sam, y'a un article pour ca:
http://sametmax.com/capturer-laffichage-des-prints-dun-code-python/

répondu 14-Mar-2015 par ashgan (698 points)

Cette solution fonctionne parfaitement dans la console python, mais, dès que je la copie dans un script...

import sys, os

old_stderr = sys.stderr
sys.stderr = open(os.devnull, 'w')
sys.stderr = new_stderr

print "yo mama

... et que j'essaye de l’exécuter depuis un terminal de base, les messages d'erreur réapparaissent.

File "test.py", line 7
    print "yo mama
                 ^
SyntaxError: EOL while scanning string literal

J'ai essayé différents terminaux, sans succès.

+2 votes

Comme le dit ashgan, il faut voir du côté de try/except.
Comme tes scripts sont bien évidemment correctement écrits, on y trouve en bas:

if __name__== '__main__':
    main()

Il suffit donc d'y mettre le try/except avec la logique que tu souhaites:

if __name__== '__main__':
    try:
        main()
    except Exception:
        if not LA_VARIABLE_GLOBALE_INDIQUANT_LE_MODE_NODEBUG:
            raise

On pourrait aussi écrire un context manager qui factorise ça, avec l'intérêt de remplacer LA_VARIABLE_GLOBALE_INDIQUANT_LE_MODE_NODEBUG par un attribut du context manager histoire de tout bien encapsuler, mais là j'ai la flemme.

répondu 19-Mar-2015 par bubulle (2,238 points)
...