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 du resultat de os.system()


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Par défaut affichage du resultat de os.system()
    Bonjour à tous.

    je vous soumet un problème que je rencontre avec la commande os.system() qui ne me renvoie pas le résultat que j'attends. Comme un exemple vaut 1000 discourts :

    Soit le mini-script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/python
    import sys
    import os
     
    print "Listes des fichiers :"
    CMD = 'ls -a'
    os.system(CMD)
    Si je le lance normalement, j'obtiens bien :
    Listes des fichiers :
    . .. fichier1.txt fichier2.txt fichier3.txt test_display.py
    -> donc la je suis content ! ^_^

    Mon but est de le lancer par crontab et la en revanche j'obtiens (le resultat est récupéré par mail dans le compte pour lequel le crontab est configuré):
    . .. fichier1.txt fichier2.txt fichier3.txt test_display.py
    Listes des fichiers :
    -> Et la je suis moins content...

    Je ne sais pas vraiment de quel coté chercher : dois je utiliser system ou une autre commande, dois-je forcer le résultat de la commande system ?

    Merci de votre attention.
    Cordialement

  2. #2
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Bonjour,
    Un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    p = subprocess.Popen(args=['ls',  '-a']
                       , stdout=subprocess.PIPE
                       , stderr=subprocess.STDOUT)
    if not p.wait():
        result = p.stdout.readlines()
        print result
    Un truc plus générique. Qui fonctionne également sous Windows, mais certaines valeurs par défaut n'ont plus de sens, et il faudra certainement intégrer le path dans la commande par exemple.
    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
    def getLinuxShellCommandResult(command=['ls',  '-a'], path = '.', clean=lambda _:_.strip(), filter=lambda _:True):
        u"""Retourne la sortie de la commande command sous forme d'une liste de chaînes,
        None en cas d'erreur (masque éventuellement le message d'erreur du shell)
        
        @param command: La commande (peut intégrer un path). par défaut, ['ls',  '-l']
        @type command: list of str
        
        @param path: Un path éventuel, par défaut le répertoire courant '.'
        @type path: str
        
        @param clean: Une fonction de nettoyage, par défaut str.strip()
        @type clean: function qui prend une str et renvoie une str
        
        @param filter: Une fonction de filtrage, par défaut ne fait rien
        @type filter: function qui prend une str et renvoie un bool
        
        @return: Liste de lignes renvoyées ou None
        @rtype: list of str
        
        """
        p = subprocess.Popen(args=command + [path]    
                           , stdout=subprocess.PIPE
                           , stderr=subprocess.STDOUT)
        return [[clean(_) for _ in p.stdout.readlines() if filter(_)], None][p.wait() != 0]
     
    #Par défaut
    lines = getLinuxShellCommandResult()
    print lines and '\n'.join(lines)
     
    #ls -l autre path
    lines = getLinuxShellCommandResult(command=['ls', '-l'], path='/usr')
    print lines and '\n'.join(lines)
     
    #Juste le premier 'mot'
    lines = getLinuxShellCommandResult(command=['ls', '-l']
                                , clean=lambda _:_.strip().split()[0])
    print lines and '\n'.join(lines)
     
    #vire les lignes vides et la ligne "total XX"
    lines = getLinuxShellCommandResult(command=['ls', '-l']
                                , filter=lambda _:_.strip().split()[0].lower() not in ['total', ''])
    print lines and '\n'.join(lines)
     
    #Renvoie uniquement les noms (sans les fichiers cachés)
    lines = getLinuxShellCommandResult(command=['ls', '-l']
                                , clean=lambda _:_.strip().split()[-1]
                                , filter=lambda _:_.strip().split()[0].lower() not in ['total', ''])
    print lines and '\n'.join(lines)
     
    #Renvoie uniquement les noms (avec les fichiers cachés)
    lines = getLinuxShellCommandResult(filter=lambda _:_.strip().split()[0].lower() not in ['.', '..'])
    print lines and '\n'.join(lines)
    Penser à importer subprocess...
    Bonne journée...

Discussions similaires

  1. Réponses: 16
    Dernier message: 14/05/2007, 16h33
  2. calcul à partir de plusieur champs et affichage du resultat dans un champ
    Par carmen256 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 24/05/2006, 11h47
  3. affichage du resultat d'une requête
    Par PAUL87 dans le forum Access
    Réponses: 3
    Dernier message: 25/09/2005, 20h12
  4. [JSP] affichage de resultat sur plusieurs pages
    Par de LANFRANCHI dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 10/02/2005, 10h00
  5. Réponses: 2
    Dernier message: 29/11/2004, 12h13

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