Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Général Python
Général Python Forum d'entraide sur les fondamentaux du langage Python, syntaxe, POO, bibliothèque standard, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/02/2013, 20h12   #1
Spheerys
Invité de passage
 
Inscription : février 2013
Messages : 1
Détails du profil
Informations forums :
Inscription : février 2013
Messages : 1
Points : 0
Points : 0
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 :
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 :
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.
Spheerys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 20h41   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 739
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 739
Points : 4 581
Points : 4 581
Salut,
Citation:
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 06h43   #3
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 797
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 797
Points : 3 109
Points : 3 109
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 ...
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 07h52   #4
plxpy
Membre émérite
 
Avatar de plxpy
 
Homme
Ingénieur
Inscription : janvier 2009
Messages : 505
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : janvier 2009
Messages : 505
Points : 917
Points : 917
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 ?
plxpy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 09h07   #5
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 797
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 797
Points : 3 109
Points : 3 109
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.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 09h46   #6
plxpy
Membre émérite
 
Avatar de plxpy
 
Homme
Ingénieur
Inscription : janvier 2009
Messages : 505
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : janvier 2009
Messages : 505
Points : 917
Points : 917
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ù ?
plxpy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 11h08   #7
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 797
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 797
Points : 3 109
Points : 3 109
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... ).
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h37.


 
 
 
 
Partenaires

Hébergement Web