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 subprocess


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut Utilisation de subprocess
    Bonjour,

    J'aimerais savoir si c'est possible d'ouvrir un fichier avec le module subprocess?

    merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Dans la mesure où la commande que tu mettras dans subprocess peut ouvrir un fichier, oui.

    Mais si c'est pour traiter le contenu du fichier en Python, ça n'a pas beaucoup de sens.

    Je suppose que tu connais l'instruction 'open("filename", "r")'

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    oui c'est plutot le premier cas puisque je cherche à ouvrir un fichier à distance.....on ma parlé de l'instruction: echo "blop" >> file sa signifie koi?

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Est une commande shell. Echo “affiche” simplement ce que tu lui donnes (ici, “blop”).
    >> est un opérateur qui va prendre ce qu’il a en entrée «*à gauche*», et l’ajouter à la sortie «*à droite*» –*en l’occurence, ton fichier

    Donc, envoyer (par ssh par ex.) cette commande à la machine distante va bien (normalement*!) ajouter “blop” au contenu de file

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    donc si j'ai bien compris, si je met le code suivant:

    proc = subprocess.popen(["ssh","user+"@"+hostname,echo "blop" >> filename],stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    ca devrait m'écrire blop dans filename?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    ça à l'air de bien marcher sauf que je peut plus arrèter le processus une fois lancé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    toto[103]>test.py 
     
    [6]+  Stopped                 test.py
    vrhel5[103>
    et la on voit que c'est mois qui est obligé de stopper le processus

  7. #7
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    ben oui, forcément, ssh est une appli interactive… Donc soit tu lui passes une commande pour le fermer (connais pas assez ssh pour savoir laquelle –*exit, peut-être…), soit tu fais un p’tit proc.terminate() une fois que ta commande a été exécutée…

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    comme je lance plusieurs fois la ligne proc = subprocess.Popen(.......) sa voudrait dire que je dois à chaque fois ajouter à la suite mon proc.terminate (c'est bien la bonne instruction) ou juste une seule fois à la fin du programme??

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    bon j'explique rapidement ce que je veut faire:

    vérifier si une ligne est présente dans un fichier distant avec "grep":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    ensuite je sais pas comment savoir si cette ligne est vraiment présente ou non

    puis ensuite je veux ajouter cette ligne si non présente dans le fichier avec echo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc = subprocess.Popen(["ssh", user+"@"+hostname,"echo 'blop' >> filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    si quelqu'un a une idée, sa fait des jours que je cherche sans résultat

  10. #10
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Ah mais oui mais non*! Si tu veux exécuter plusieurs commandes sur le PC distant, ’faut surtout pas relancer à chaque fois une session ssh*!

    Normalement, une fois que tu es connecté(e), tu devrais pouvoir envoyer des commandes avec proc.stdin, comme sur un vrai terminal…

    Par exemple*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    # Tu t’assures que la connexion est bien établie, et que le résultat de grep est bon…
    # Puis tu envoies ta deuxième commande*!
    proc.stdin.write("echo 'blop' >> filename\n")
    # etc.
    # Et enfin, tu termines ton sous-processus.
    proc.terminate()

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Août 2008
    Messages : 505
    Par défaut
    Pour faire ce genre de chose, il y a des modules qui existent, comme paramiko. Ca evite d'avoir à gérer des choses un peu délicates dans le fait de lancer un ssh comme un process isolé.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Ben ça à l'air de fonctionner sauf pour la seconde instruction avec le stdin, voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BLOP = 'blop'
     
    proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep -x 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    CheckProcState = proc.poll()
    if CheckProcState == None:
    	data = proc.communicate()
    	result = data[0].strip()
    	if result != BLOP:
    	     proc.stdin.write("echo 'blop' >> filename\n")
    	     proc.stdin.close()
    et sa m'affiche comme message d'erreur:

    AttributeError: 'NoneType' object has no attribute 'write'

  13. #13
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Regarde le code qu’on te donne quand même*! J’ai écrit…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    , pas…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep -x 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    !!!

    Et tu n’as pas besoin de faire un stdin.close(), stdin n’est qu’un lien (un pipe) avec ssh, pas un “vrai” fichier*!

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    alors toujours aucun résultat concernant le stdin, j'ai fait les rectifications necessaires mais je n'y comprend vraiment pas grand chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' ucdprod"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
     
    if proc.poll() == None: # si le process n'est pas encore terminé
          proc.stdin.write("echo 'blop' >> ucdprod")

    qu'est ce qui ne va aps dans mon code?

  15. #15
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Grmmmlll… Cette fois, tu oublies le '\n' à la fin de ta commande… Si tu ne tapes pas entrée, dans un terminal, ça ne marche pas non plus, s’pas*?

    Et si ça ne marche toujours pas, tu peux essayer de rajouter un proc.stdin.flush() juste après le write(), mais je doute vraiment que ce soit nécessaire…

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    ah oui je l'avais rajouté le "\n" dsl.....mais concernant le code que je viens d'établir à priori cela devrait marcher nn

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    que signifie dans le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' ucdprod"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
     
    proc1 = subprocess.Popen(["ssh", user+"@"+hostname,"echo 'blop' ucdprod"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=proc.PIPE)
    le stdin = proc.PIPE dans la seconde instruction? merci.....

  18. #18
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Ben, simplement que tu utilises le même pipe (le même “fichier” virtuel) en entrée pour les deux procs (puisque tu utilises le stdin de proc comme stdin pour proc1)… Je ne suis pas absolument certain que ce soit fonctionnel, cela dit…

    Bou, j’étais fatigué, hier soir, j’avais mal lu…

  19. #19
    Membre Expert 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
    Par défaut
    Bonjour,

    Et bien cela semble une tentative de faire un pipe (|) mais dans l'état actuel cela ne fonctionneras pas. La syntaxe correcte est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    proc = subprocess.Popen([commande], stdout=subprocess.PIPE)
    proc1 = subprocess.Popen([othercommand], stdin=proc.stdout, stdout=subprocess.PIPE)
    proc.stdout.close()
    sortie = proc1.communicate()[0]
    Ceci dit avez vous penser à pexpect ? Dans le cadre d'une 'interaction' cela me semble plus approprié.

    @+

Discussions similaires

  1. IHM qui freeze lors d'utilisation subprocess
    Par deusyss dans le forum GUI
    Réponses: 8
    Dernier message: 15/10/2013, 09h31
  2. Utilisation de os.system ou subprocess.Popen
    Par othke dans le forum Général Python
    Réponses: 8
    Dernier message: 28/09/2011, 12h05
  3. Réponses: 5
    Dernier message: 16/02/2011, 10h23
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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