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 :

Comment récupérer des valeurs dans le résultats d'une commande ?


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Comment récupérer des valeurs dans le résultats d'une commande ?
    Bonjour,

    Je cherche un moyen de récupérer l'espace disque restant sur certaines partitions au moyen d'un script écrit en Python.
    J'avais trouvé le moyen de faire en Bash, mais je ne parviens pas à adapter mon code pour qu'il fonctionne dans mon nouveau script.

    Voici mon script (il sert à monitorer des serveurs via XMPP/Jabber) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #!/usr/bin/python                              
    # by Hubert Chathi, 2007, 2008, 2009
    # This file is hereby placed in the public domain.  Feel free to modify
    # and redistribute at will.
    # (Note, however, that python-jabberbot, which this file depends on, is
    # licensed under the GNU GPL v3 or later, and xmppy is licensed under the
    # GNU GPL v2 or later.)
    # coding: utf-8
    # -*- coding: utf-8 -*-
     
    import xmpp
    import os
    from jabberbot import JabberBot, botcmd
    from ConfigParser import RawConfigParser
     
    class SystemBot(JabberBot):
        @botcmd
        def who(self, mess, args):
            """Display who's currently logged in."""
            who_pipe = os.popen('/usr/bin/who', 'r')
            who = who_pipe.read().strip()
            who_pipe.close()
     
            return who
     
        def idle_proc(self):
            status = []
     
            load = '%s %s %s - ' % os.getloadavg()
            status.append(load)
     
            # espace libre
    #       DFVAR=`df -h |grep xvdb | mawk -Wp '{print $4}'`
    #       DFROOT=`df -h |grep xvda1 | mawk -Wp '{print $4}'`
    #       DFBACKUPS=`df -h |grep xvdd | mawk -Wp '{print $4}'`
     
     
     
            # calculate the uptime
            uptime_file = open('/proc/uptime')
            uptime = uptime_file.readline().split()[0]
            uptime_file.close()
     
            uptime = float(uptime)
            (uptime,secs) = (int(uptime / 60), uptime % 60)
            (uptime,mins) = divmod(uptime,60)
            (days,hours) = divmod(uptime,24)
     
            uptime = 'up %d jour%s, %d:%02d' % (days, days != 1 and 's' or '', hours, mins)
            status.append(uptime)
     
            # calculate memory and swap usage
            meminfo_file = open('/proc/meminfo')
            meminfo = {}
            for x in meminfo_file:
                try:
                    (key,value,junk) = x.split(None, 2)
                    key = key[:-1] # strip off the trailing ':'
                    meminfo[key] = int(value)
                except:
                    pass
            meminfo_file.close()
     
            memusage = 'Memory used: %d of %d kB (%d%%) - %d kB free' \
                       % (meminfo['MemTotal']-meminfo['MemFree'],
                          meminfo['MemTotal'],
                          100 - (100*meminfo['MemFree']/meminfo['MemTotal']),
                          meminfo['MemFree'])
            status.append(memusage)
            if meminfo['SwapTotal']:
                swapusage = 'Swap used: %d of %d kB (%d%%) - %d kB free' \
                          % (meminfo['SwapTotal']-meminfo['SwapFree'],
                             meminfo['SwapTotal'],
                             100 - (100*meminfo['SwapFree']/meminfo['SwapTotal']),
                             meminfo['SwapFree'])
                status.append(swapusage)
     
            status = '\n'.join(status)
            # TODO: set "show" based on load? e.g. > 1 means "away"
            if self.status_message != status:
                self.status_message = status
            return
     
    config = RawConfigParser()
    config.read(['/etc/systembot.cfg','systembot.cfg'])
     
    bot = SystemBot(config.get('systembot','username'),
                    config.get('systembot','password'))
    bot.serve_forever()
    Vous l'aurez sans doute remarqué, mon ancien code en Bash est commenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            # espace libre
    #       DFVAR=`df -h |grep xvdb | mawk -Wp '{print $4}'`
    #       DFROOT=`df -h |grep xvda1 | mawk -Wp '{print $4}'`
    #       DFBACKUPS=`df -h |grep xvdd | mawk -Wp '{print $4}'`
    Quelle serait l'équivalent en Python pour récupérer ces valeurs dans des variables que je pourrai exploiter par la suite dans le script ci-dessus ?

    Merci d'avance.

  2. #2
    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,
    Quelle serait l'équivalent en Python pour récupérer ces valeurs dans des variables que je pourrai exploiter par la suite dans le script ci-dessus ?
    Pour exécuter des commandes ou progs "externes", il faut passer par subprocess. Il y a un bon tuto ici

    Regardez aussi ici, çà montre comment récupérer la sortir de "df -h" pour en sortir les informations souhaitées depuis Python: plus besoin de lancer 3 fois la séquence "df", "grep", "mawk"

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour lancer en console un programme Python en y ajoutant des options de commandes, on peut utiliser le module 'argparse' sous Python 3.x et Python 2.7 ('optparse' pour les versions précédentes).

    C'est un peu compliqué à comprendre et à utiliser, mais avec un peu de pratique, c'est vraiment très puissant, et ça permet de faire effectivement tout ce qu'on fait habituellement avec les commandes système en console. Y compris ces très longues lignes de commandes invraissemblables que certains adorent ...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    de façon générale, comme l'a écrit wiztricks, pour récupérer le résultat (ici ce qui est écrit sur la sortie standard) d'une commande, tu passes par subprocess.

    Mais ici, tu peux directement utiliser os.statvfs pour récupérer les infos dont tu as besoin, sans lancer de commande.


    nb : par contre, je ne vois pas le rapport entre ta question et argparse/optparse ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par plxpy Voir le message
    nb : par contre, je ne vois pas le rapport entre ta question et argparse/optparse ?[/I]
    Parce que telle qu'elle est posée, la question peut aussi être comprise comme ça. Au PO de savoir quelle réponse lui convient.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par tyrtamos
    Parce que telle qu'elle est posée, la question peut aussi être comprise comme ça
    Ca m'échappe complètement. Argparse/optparse pourrait s'utiliser s'il avait une ligne de commande (via sys.argv) à décoder (dans un script exécutable typiquement). Là, c'est le résultat d'une commande externe (commande df pipée avec grep puis mawk) qu'il veut récupérer.

    Je ne vois pas du tout où ce genre de parser pourrait être utilisé ici. Tu le ferais intervenir où ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Je ne vois pas du tout où ce genre de parser pourrait être utilisé ici. Tu le ferais intervenir où ?
    Je pensais qu'il voulais imiter les exemples qu'ils donnent avec son code Python.

    Mais si je n'ai pas compris, ce n'est pas grave! D'ailleurs, ça peut lui donner des idées pour lancer son code Python en passant des arguments qu'il donnera ensuite aux commandes système.

    Si ma réponse est à côté, il mettra environ 1 seconde à l'éliminer, et moi, ça m'aura coûté seulement 3 minutes à l'écrire (et 5 minutes à la justifier... ).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Réponses: 13
    Dernier message: 09/11/2011, 12h06
  2. Réponses: 21
    Dernier message: 18/11/2008, 14h36
  3. Réponses: 2
    Dernier message: 12/04/2006, 10h00
  4. Réponses: 3
    Dernier message: 03/04/2006, 18h30
  5. Récupérer des valeurs dans des fichiers html
    Par nico93100 dans le forum Langage
    Réponses: 1
    Dernier message: 05/01/2006, 21h46

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