Forum Programmation.shell Redirection console + fichier

Posté par  . Licence CC By‑SA.
Étiquettes :
0
9
avr.
2018

Bonjour :)

J'ai un petit script python qui attends des intereractions utilisateurs (avec raw_input).

Pour pouvoir débugger mon programme, j'aimerais rediriger la sortie standard + sortie d'erreur dans un fichier.

Le problème c'est que si je fais ça naïvement avec >, tout part dans le fichier et je ne vois donc plus mes messages liés à mes raw input (et vu que c'est un petit pogramme interractif, bah je peux rien faire).

Du coup, je souhaiterais rediriger la sortie standard + sortie d'erreur vers un fichier de log tout en continuant d'afficher sur la console (histoire que je puisse interragir avec mon programme).

Auriez vous des pistes sur comment je pourrais m'y prendre ?

Cordialement

  • # tee

    Posté par  . Évalué à 4.

  • # tee ?

    Posté par  (site Web personnel) . Évalué à 1.

    La commande tee ne pourrait pas t'aider ?

  • # developper comme il faut

    Posté par  . Évalué à 3.

    par defaut il y a plusieurs canaux,
    le stdout (>)
    le stderr (2>)

    si tu programmes comme il faut, tes sorties standard se font sur stdout,
    tu peux alors rediriger les stderr vers un fichier

    tonscript.py 2>tonfichier_erreurs.log

    si tu veux rediriger le standard et l'erreur dans deux fichiers differents

    tonscript.py > tonfichier.log 2>tonfichier_erreurs.log

    si tu veux rediriger dans le meme fichier (en fait la sortie 2 dans la sortie 1 dans tonfichier.log

    tonscript.py >tonfichier.log 2>&1
    • [^] # Re: developper comme il faut

      Posté par  . Évalué à 2.

      certes, mais ce qu'on cherche à faire là, c'est à rediriger stdout et stderr dans un fichier, tout en continuant à afficher stdout

      • [^] # Re: developper comme il faut

        Posté par  . Évalué à 3.

        avec tee comme indiqué dans un autre poste, ou en bidouillant

        dans un terminal tu lances le script

        tonscript.py >tonfichier.log 2>&1

        dans un autre tu surveilles ce qu'il y a dans le log, ce qui te permet de repondre au question, en tapant dans le premier terminal

        tail -f tonfichier.log
        • [^] # Re: developper comme il faut

          Posté par  . Évalué à 2.

          oui. Je trouvais juste ton premier commentaire un peu trop générique par rapport à la question. Aussi, tel que je l'avais compris, l'enjeu intéressant était d'arriver à joindre stderr et stdout dans un fichier tout en continuant à les discriminer pour l'affichage. Mais vu la suite de la discussion, c'était un peu overkill :)

  • # peut-être tee ?

    Posté par  . Évalué à 2.

    la commande tee écrit copie la sortie standard dans un fichier. Peut-être un truc du genre

    <commande> 2>> fichier | tee -a fichier

    Bon, en testouillant, l'ordre des lignes dans le fichier généré n'est pas respecté, donc c'est pas parfait.

    Tu peux tenter en te mettant en less +F sur ton fichier de log global, et utiliser ton fichier de log pour l'affichage du résultat de tes commandes interactives. Mais si tu as trop de lignes sur stderr, ça va être compliqué.

    Autre possibilité, si tu as la main sur le code source de ce que tu testes, rajoute les entrées utilisateurs dans tes lignes de debug.

    • [^] # Re: peut-être tee ?

      Posté par  . Évalué à 3. Dernière modification le 09/04/18 à 11:21.

      commande 2>&1 | tee nom_fichier_out

      • [^] # Re: peut-être tee ?

        Posté par  . Évalué à 2.

        ça peut répondre au besoin, mais c'est pas idéal. Dans le cas d'un programme qui ferait beaucoup de polling ou qui serait multi-thread, ça pourrait rendre stdout inexploitable en mode interactif. L'idéal serait de continuer à afficher juste stdout. Mais tee semble répondre au besoin de madem, donc bon, restons-en là :-)

  • # Redirection console + fichier

    Posté par  . Évalué à 1.

    J'avais déjà regardé tee mais je n'avais aucun retour (mis à part à la fin du programme) quand je faisait un truc du style python mon_prog.py | tee log.log.
    Mais en flushant mes affichage dans mon programme, ça à résoulu le problème :)

    DOnc effectivement, tee était la solution (ou du moins une des solutions).

    Merci pour la réactivité en tout cas !

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.