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 :

Utilisation de exec*() en python


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Utilisation de exec*() en python
    Bonsoir ,
    Je voudrais écrire du code en python qui puisse faire les commandes élémentaires du shell(ls, cd, ...). S'il le faut en utilisant la famille exec..
    NB: J'ai déjà mon prompt qui est prèt à lire sur le clavier; il faut donc intrpréter les commandes afin de les exécuter...

    Merci par avance !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonsoir,

    tu cherches à implémenter 'ls' dans une session interactive python en faisant en sorte que la commande se lance en écrivant juste 'ls' et pas 'ls()' ?

    ou alors tu as un script qui lance lui même une session interactive et tu veux pouvoir entrer des commandes shell ?

    pour le premier cas, à vrai dire je ne sais pas trop. pour le second cas, on peut imaginer quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import subprocess
    while 1:
        cmd = raw_input(">>> ")
        if cmd == 'exit':
            break
        else:
            subprocess.Popen(args=cmd.split())

  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
    La réponse de Kango est bien celle que j'aurai proposé.
    Maintenant un peu d'explication.

    1) Subporcess
    Tu peux utiliser subprocess qui te permet de traiter la sortie (de la parser, de l'afficher a l'écran etc...). Voila comment ca fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    from subprocess import *
    commande = ["ls","-a"]
    out=Popen(commande,stdout=PIPE)
    (sout,serr)=out.communicate()
    print sout
    en fait la commande doit être une liste ou chaque element est un mot de ta ligne de commande linux (d'ou le .split() de Kango)

    Le sout est la sortie (format=chaine de charactere) si ca fonctionne bien et le serr en cas d'erreur (cf la doc pour plus d'explication la dessus)

    2)os.system
    Un peu moins propre mais qui fonctionne trés bien, la commande os.system.
    Ca te permet de faire executer une opération par ton os, mais a ce moment la tu ne peux plus récupérer la réponse (et donc voir le résultat de ton action).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import os
    os.system("ls -a")
    Bon évidemment il n'y a aucun interet de faire un os.system pour un 'ls', puisque par définition tu ne peux pas voir le résultat...


    3)exec/eval

    Servent a faire executer une chaine de charactere par le programme python lui même
    ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    a="print toto"
    exec(a)
    va permettre d'afficher toto.

    eval fais la même chose, mais permet de récupérer le résultat (a la maniere d'une fonction)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a="6*8"
    b=eval(a)
    print b
    va afficher 48

    bon il parait que ce n'est pas propre et pas trés conseillé. J'avoue que personnellement je ne comprend pas vraiment pourquoi, mais je fais toute confiance aux gens bien meilleurs que moi dans ce domaine, et donc c'est a éviter.

    Il y a la méthode getattr qui te permet de faire plus ou moins la même chose. (et la c'est considéré comme propre)
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Toto():
        def foo(self)
            print "hello"
     
    #main
    t=Toto()
    getattr(t,foo)
    la derniere ligne te permet de faire un: t.foo() (et donc en l'occurence d'afficher hello). Bref un peu le même principe qu'exec et eval. Mais en mieux parait-il

    voila j'espere que j'ai été clair
    ++
    Julien

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    C'est un sujet à la mode dernièrement il semble...

    Regarde du coter de Pexpect ou encore ce sujet si tu souhaite quelque chose de plus 'évolué'.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos messages !
    Mais en fait ce que je veux, c'est de créer un processus ( fils ) qui va éxecuter la commande saisie au clavier(commande destinée au shell par exemple ls -l ou cat toto titi tata ou ps -aux...) le mieux avec la famille exec*().Je na sais pour l'instant pas utiliser la commande os.exec*()
    NB: Toujours en langage Python
    Merci pour votre attention !

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    Citation Envoyé par chedu06 Voir le message
    Mais en fait ce que je veux, c'est de créer un processus ( fils ) qui va éxecuter la commande saisie au clavier(commande destinée au shell par exemple ls -l ou cat toto titi tata ou ps -aux...)
    je suppose que tu n'as pas essayé mon bout de code ? c'est exactement ce qu'il fait.

    Citation Envoyé par chedu06 Voir le message
    le mieux avec la famille exec*()
    pour moi le mieux c'est subprocess, chacun son point de vue

  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
    Tu as clairement pas essayé le code de kango,ni vraiment lu ce que j'ai expliqué.
    J'dois avouer que j'ai pas regardé le module que propose pausekawa, mais en général il est plutot efficace dans ses réponses. Donc une fois encore je doute que tu te sois penché sur ce qu'il propose
    ...j'ai l'impression qu'on tourne en rond la! J'suis le seul?
    Si tu (re)lis mon post ,je t'explique comment fonctionne exec. Et pour ce que tu veux faire, je ne pense pas que ce soit ce qu'il te faille

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Puisque tu ne semble pas vouloir aller plus loin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import os
    os.system('xterm') # Ou le terminal que tu veux
    @+
    Merci d'utiliser le forum pour les questions techniques.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bsr,
    Encore une fois merci pour l'attention que vous portez à mes questions.
    ju_bicycle j'ai lu le code de kango et je l'ai même testé.Evidemment il me donne le resultat que je cherche;mais il ne représente pas la démarche aproprié à mon projet.Je veux moi-même créer mes processus fils(os.fork()) quand une commande est saisie et utiliser os.exec*() pour executer la commande.Effectivement tous vos codes convergent au même résultat; le code de PauseKawa aussi; mais lui demande à l'os de faire le boulot à ma place.Alors que moi je veux signifier a l'os que par exemple ls se trouve dans /bin/ls:va me chercher son binary file pour exécuter cette commande..Je crois que cette fois-ci j'ai été plus clair que précedemment.
    En tout cas je vous remercie par avance !

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    il y a une raison particulière de vouloir forker toi même le parent via un appel à os.fork() plutôt que de laisser faire subprocess ?

    dans un intérêt pédagogique pourquoi pas, mais pour un intérêt pratique, je ne vois pas.

    si tu veux utiliser les mécaniques de bas niveau: http://docs.python.org/library/os.ht...ess-management

    bonne lecture

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par chedu06 Voir le message
    le code de PauseKawa aussi; mais lui demande à l'os de faire le boulot à ma place.Alors que moi je veux signifier a l'os que par exemple ls se trouve dans /bin/ls:va me chercher son binary file pour exécuter cette commande..
    Dans ce cas combine mon code (Réponse 8 / dernier code) à celui ci.
    La fonction a modifier est def traite(self, commande) ou tu dois composer commande avec which.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  12. #12
    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
    Tu aurai peut être du commencer par la...Tu as été beaucoup plus clair effectivement, et d'ailleurs les personnes qui pouvaient t'aider t'ont donné quelque chose qui correspond mieux à ce que tu attend... Moi j'suis incapable de t'aider plus, ca me dépasse un peu. Enfin, on voit encore quand un probleme est bien expliqué, la réponse est plus efficace

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonsoir
    Merci bokou pr vos reponses !
    Mais je viens de me heurter à un nouveau probleme: comment recupérer un argument sur la ligne de commande pour le stocker dans une variable.Exemple: >>> ls -lt /
    J'ai essayé avec: for i in sys.argv: arg = sys.argv[i].L'erreur est la suivante : list indices must be integers; mais il se trouve que je ne sais pa convertir...Merci par avance !

  14. #14
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for arg in sys.argv[1:]:
       print arg

Discussions similaires

  1. déclencheur pl/perlu : pb d'utilisation d'exec et unlink
    Par ags_squale dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 21/12/2006, 09h11
  2. [SQL SERVER 2005] Utilisation de Exec dans une fonction ?
    Par Dadou74 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 22/09/2006, 22h09
  3. Utilisation de Timer dans Python
    Par aliassaf dans le forum Général Python
    Réponses: 5
    Dernier message: 17/06/2006, 19h06
  4. [BOOST]Comment utiliser la lib boost.python
    Par Invité dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 30/01/2006, 11h35
  5. Comment utiliser Site Exec sous FTP
    Par phig dans le forum Développement
    Réponses: 2
    Dernier message: 12/08/2003, 17h11

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