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 :

Récupérer le résultat de os.exec*()


Sujet :

Python

  1. #1
    Candidat au Club
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Récupérer le résultat de os.exec*()
    Bonjour à tous,

    j'aimerais savoir comment faire pour récupérer le résultat d'une commande UNIX, lancée avec une fonction du type os.exec*, dans une variable ou un fichier temporaire afin de l'écrire dans un pipe ou un fichier.

    Je tiens à préciser qu'il s'agit d'un projet étudiant et qu'il nous est interdit d'utiliser autre chose que os.exec*, donc exit les os.system et os.popen.

    Merci par avance.

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    La meilleure (et surement la seule d'ailleurs) solution que je vois pour réaliser cela est la suivante :
    1. Modifier le file descriptor correspondant à la sortie standard (utilisation de os.dup2) ;
    2. Exécution du programme avec la sortie standard modifiée.


    os.dup2 est une fonction unix qui permet de remplacer un file descriptor 1 par un file descriptor 2. Ainsi, os.dup2(1, 2) va dupliquer le file descriptor 2, fermer le file descriptor 1 s'il est valide et ouvert, et le remplacer par la copie du file descriptor 2.

    En pratique, ça donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    redirection = os.open('fichier.txt', os.O_WRONLY)
    os.dup2(sys.stdout.fileno(), redirection)
    os.close(redirection)
    os.exec(...)
    Cela marcherait avec n'importe quoi à la place de redirection : un pipe, un socket, etc. Tant qu'il s'agit d'un file descriptor valide et ouvert (un entier, pas un objet Python de type file), ça marchera. C'est d'ailleurs de cette manière que le shell réalise les redirections.

    Bonne soirée.

  3. #3
    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
    T'es dans la meme classe que chedu06?
    Vos deux postes semblent assez similaire. Surtout votre empressement a utiliser les os.exec*
    Regarde donc son poste, il y a des trucs interessant je pense...

  4. #4
    Candidat au Club
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    @delroth : j'avais déjà essayé un code du même genre, mais voilà le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "./redir.py", line 5, in <module>
        redirection = os.open('fichier.txt', os.O_APPEND)
    OSError: [Errno 2] No such file or directory: 'fichier.txt'
    et si je crée le fichier avant, la commande s'exécute (on voit le résultat sur stdout) et le fichier reste vide .
    Il semble que os.exec n'écrit pas dans la sortie standard du programme python, la redirection de stdout ne fonctionne que pour ce qu'affiche le programme python (les print par exemple)

    @ju_bicycle : oui, je suis bien dans la même classe que chedu06 et j'ai déjà lu ses posts.

    Edit : pour éviter l'erreur "No such file or directory" j'ai modifié le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import os,sys
     
    redirection = os.open('fichier.txt', os.O_APPEND | os.O_CREAT)
    os.dup2(sys.stdout.fileno(), redirection)
    os.close(redirection)
    os.execvp("ls",["ls"])
    le fichier est bien crée si il n'existe pas, mais os.exec n'écrit toujours pas dedans.

    EDIT2 : sujet résolu, il fallait inverser les paramètres dans os.dup2(), et fermer le fichier APRES os.execvp().
    voici le code pour ceux que ça intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import os,sys
     
    redirection = os.open('fichier.txt', os.O_WRONLY | os.O_CREAT)
    os.dup2(redirection, sys.stdout.fileno())
    os.execvp("ls",["ls"])
    os.close(redirection)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/06/2005, 10h06
  2. Réponses: 1
    Dernier message: 28/06/2005, 09h15
  3. récupérer le résultat d'une requete
    Par sheira dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2004, 11h04
  4. [C#] Récupérer le résultat d'une procédure stockée
    Par fabrice1596 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/10/2004, 13h45
  5. Réponses: 5
    Dernier message: 05/10/2004, 13h05

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