IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Affichage résultat commande Popen


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Points : 18
    Points
    18
    Par défaut Affichage résultat commande Popen
    Bonjour,
    Je souhaiterais récupérer l'affichage d'une commande exécutée a l'aide de Popen, mais le problème c'est que l'affichage est très mauvais.
    Exemple de l'affichage que je récupère lorsque j'exécute un ping :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    b'\r\n'
    b"Envoi d'une requ\x88te 'ping' sur google.fr [216.239.59.104] avec 32 octets de donn\x82es\xff:\r\n"
    b'R\x82ponse de 216.239.59.104\xff: octets=32 temps=48 ms TTL=55\r\n'
    b'R\x82ponse de 216.239.59.104\xff: octets=32 temps=46 ms TTL=55\r\n'
    b'R\x82ponse de 216.239.59.104\xff: octets=32 temps=46 ms TTL=55\r\n'
    b'R\x82ponse de 216.239.59.104\xff: octets=32 temps=53 ms TTL=55\r\n'
    b'\r\n'
    b'Statistiques Ping pour 216.239.59.104:\r\n'
    b' Paquets\xff: envoy\x82s = 4, re\x87us = 4, perdus = 0 (perte 0%),\r\n'
    b'Dur\x82e approximative des boucles en millisecondes :\r\n'
    b' Minimum = 46ms, Maximum = 53ms, Moyenne = 48ms\r\n'
    b''
    Comment faire pour avoir un affichage correct ?

    Voici comment j'utilise la fonction Popen:
    Le résultat est affiché dans une page web html.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            p = Popen([commande, IP], stdout=PIPE)
            res = open("resultat.html",'w+')
            res.write("<html><body><h1> Vous avez demandé un " + commande + " vers " + IP + " </h1><br/>")
            while True:
                line = p.stdout.readline()
                res.write("<br/>" + str(line))
                if not line:    
                    break
    Merci de votre aide.

  2. #2
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour,

    Il semblerait que l'affichage soit au format ASCII oem alors que python utilise du ASCII ANSI

    il existe les méthodes encode et decode j'aurai pensé pouvoir faire ceci mais le codecs oem n'existe pas peut-être a t-il un autre nom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'R\x82ponse'.decode(  'oem' ) .encode("utf8")
    bon courage
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Non apparement il ne connait pas eom.

    Si je fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    res.write("<br/>" + line.decode('eom') .encode('utf8'))
    LookupError: unknown encoding: eom
    ou ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    res.write("<br/>" + line.decode() .encode('utf8'))
    TypeError: Can't convert 'bytes' object to str implicitly

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Attention, tu as tapé eom au lieu de oem.

  5. #5
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour

    Voici un début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def oem2ansi( oem ) :
        r = oem.replace( '\x82', '\xc3\xa9' )
        r = r.replace( '\xe8', '\xc3\xa8' )
        r = r.replace( '\x87', '\xc3\xa7' )
        r = r.replace( '\x85', '\xc3\xa0' )
        r = r.replace( '\x97', '\xc3\xb9' )
        r = r.replace( '\x8b', '\xc3\xaf' )
        return r # .decode("utf-8") pour unicode
     
    print  oem2ansi( 'R\x82ponse' )
    Pour continuer : Table ASCII OEM

    bon courage
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup pour ta réponse.
    Cette fonction est très utile mais je n'arrive pas à l'appliquer à la ligne que je récupère.
    Voici comment je procède :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                line = p.stdout.readline()
                if not line:    
                    break
                rep = oem2ansi( str(line) )
                print (str(rep))
    Mais il m'affiche le même résultat que précédemment.
    je suis obligé de faire str(line) car si non j'ai une erreur lors de l'exécution de la fonction.
    Où est mon erreur ?
    Merci de votre aide.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    salut,
    personellement, j'utilise subprocess de la maniere suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from subprocess import *
     
    commande=['ping','192.168.x.x']  #Definition de la commande dans une liste
    out=Popen(commande,stdout=PIPE)
    (sout,serr)=out.communicate()
    #Puis la réponse de trouve dans sout, qui est une chaine de charactere et qu'on peut afficher/parser facilement:
    print sout
    #ou
    page=sout.split("\n") #la variable page contient maintenant la réponse ligne par ligne... ect
    J'espere que ca t'aidera
    ++

  8. #8
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par vincent.mbg Voir le message
    Bonjour

    Voici un début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def oem2ansi( oem ) :
        r = oem.replace( '\x82', '\xc3\xa9' )
        r = r.replace( '\xe8', '\xc3\xa8' )
        r = r.replace( '\x87', '\xc3\xa7' )
        r = r.replace( '\x85', '\xc3\xa0' )
        r = r.replace( '\x97', '\xc3\xb9' )
        r = r.replace( '\x8b', '\xc3\xaf' )
        return r # .decode("utf-8") pour unicode
     
    print  oem2ansi( 'R\x82ponse' )
    Pour continuer : Table ASCII OEM

    bon courage
    Bonsoir,
    je remonte ce post pour savoir comment on passe de la table donnée en PDF aux replace ci-dessus.

  9. #9
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Une réponse partielle se trouve ici : http://www.utf8-chartable.de/ .

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    oem se dit aussi "cp437".
    On devrait donc pouvoir transformer les lignes lues en utf-8 via:
    line.decode('cp437').encode('utf-8')
    Par contre, une page est encodée latin-1 par défaut... il faut donc dire qu'on lit de l'utf-8 avec un meta genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    html_head = """
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      </head>
      <body>
    """
    - W
    PS: Pour être complet, il faudrait aussi échapper certains caractères "utf-8" qui ne sont pas "valides" lorsque représentés en HTML exemple: <,>,&,...
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    oem se dit aussi "cp437".
    On devrait donc pouvoir transformer les lignes lues en utf-8 via:
    line.decode('cp437').encode('utf-8')
    Merci pour cette précision.

Discussions similaires

  1. [MySQL] Affichage résultat requête SQL dans page HTML comme un tableau
    Par joxbl dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 14/03/2011, 14h26
  2. [SQL] Affichage résultat requête dans un tableau, bouton affichage page
    Par megapacman dans le forum PHP & Base de données
    Réponses: 35
    Dernier message: 18/05/2006, 16h42
  3. Réponses: 1
    Dernier message: 11/05/2006, 16h37
  4. Affichage résultat type Google (multipage multibase)
    Par LeCaméléon dans le forum XMLRAD
    Réponses: 7
    Dernier message: 02/04/2006, 16h17
  5. Affichage résultat de requête dans un champ
    Par dj-julio dans le forum WinDev
    Réponses: 1
    Dernier message: 18/01/2006, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo