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 :

Fork et wait


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut Fork et wait
    Bonjour à tous!

    Comme un exemple vaut mieux qu'un long discour;
    J'aimerais tout simplement reproduire ce bout de code C en python:
    (Bien entendu me passer de path en env, serait super! )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      if ((pid = fork()) < 0)
        printf("Erreur at \"fork\"\n");
      if (pid > 0)
        {
          code = wait(&status);
          // On connait le vrai retour du fils! :D
        }
      else
        execve(path, command, env);
    Voilà, donc ce que j'aimerais c'est executer une commande: cat, mail, ps....
    Peu importe la fonction exec, call, system...mais de façon à ce que je connaisse le retour du fils!

    J'ai déjà essayé plusieurs chose mais sans succès. Le code retourné est toujours le même

    En bonus, j'aimerais pouvoir empecher le fils d'écrire sur le shell. Cependant c'est vraiment secondaire.

    J'ai testé avec des wait, waitpid, system, popen, fork...
    Mais rien n'y fait. De plus je trouve la documentation de Python pas supère du moins quand je la compare à celle de PHP ou C.
    Non?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 691
    Par défaut
    Hmmm
    Python est un langage OO et non procédural comme C.
    Pour faire un fork, vous devez utiliser multiprocessing...
    Et oublier "fork".

    fork colle trop à la réalité de la mécanique de l'OS qui est derrière. L'exécution du fork fait en gros:
    • la duplication de l'espace virtuel du contexte courant,
    • le "clone" servira de contexte au fils
    • à la sortie, la première question est qui est le père, suis-je bien le fils.

    Avec Python, vous créez un thread ou un process et vous lui donnez le callable (fonction ou méthode), ses paramètres,... et vous récupérez le retour de la fonction (qui peut être un uplet).

    Si dans le contexte du "fils" vous voulez exécuter une commande "shell"
    vous avez a votre disposition subprocess.
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    Python est un langage OO et non procédural comme C.
    Pour faire un fork, vous devez utiliser multiprocessing...
    Et oublier "fork".
    Ah très bien merci.

    Avec Python, vous créez un thread ou un process et vous lui donnez le callable (fonction ou méthode), ses paramètres,... et vous récupérez le retour de la fonction (qui peut être un uplet).

    Si dans le contexte du "fils" vous voulez exécuter une commande "shell"
    vous avez a votre disposition subprocess.
    En vérité ce qui m'interessait est justement récuperrer le retour de la commande "shell".

    Je pensais utiliser fork pour récupérer le retour du fils et ainsi de la commande, mais est-ce identique avec Python? Et est-ce conseillé?

    Dernière question, y a t-il un moyen simple de récupérer le code de retour de la commande "shell"? (Sans créer de thread j'entends)

    Quelque chose dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    code = supère_fonction(command_shell)
    print code # qui me dit si la fonction s'est bien terminée ou non
    Peut être que cela existe?

  4. #4
    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,

    subprocess avec stdout ou communicate suivant ce que tu recherche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
    @+

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
    Ca fonctionne pas de base avec les Pipes, mais après avoir ajouté un: shell = True
    Ca execute bien la commande!
    Cependant je n'arrive pas à récuperer la sortie (à savoir le message d'erreur de la commande avec Popen...)

    En effet si je fais: (test étant une commande)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    output = subprocess.Popen([test], shell=True, stderr=subprocess.PIPE).communicate()[0]
    print output
    Que la commande soit valide ou non, j'ai comme output 'None'

    Et si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    output = subprocess.Popen([test], shell=True, stdout=subprocess.PIPE).communicate()[0]
    print output
    Que la commande soit valide ou non, j'ai comme output ' '

    En revanche la seconde fois, la commande (test) arrive à écrire sur la sortie.
    J'en conclue que la commande arrive à y parvenir de façon indépendante à Python.

    Y a-t-il un moyen pour moi de quand même savoir si la commande a échouée ou pas?

    Peut-être la syntaxe qui n'est pas correcte chez moi?
    En effet test contient: plusieurs commande et leurs arguments ainsi qu'un pipe, cela joue t-il un rôle?

  6. #6
    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,

    Un pipe ? Non :

    test.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/bash
    ps -Al | grep python
    op.py :
    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
    from subprocess import Popen, PIPE
    from os import waitpid, getcwd
    from time import sleep
    from os.path import join
     
    print ("Lancement de la commande")
    output = Popen([join(getcwd(), "test.sh")], stdout=PIPE).communicate()[0]
    print ("Attente") # Pour montrer que ce n'est pas la sortie standard
    sleep(2.0)
     
    print ("Sortie")
    sleep(1.0)
    print output
     
    sleep(2.0)
     
    print ("Lancement de la commande avec shell")
    output = Popen([join(getcwd(), "test.sh")], shell=True, stdout=PIPE).communicate()[0]
     
    print ("Attente")
    sleep(2.0)
     
    print ("Sortie")
    sleep(1.0)
    print output
    Sortie :
    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
    patrice@Zeus:~/Bureau$ /usr/bin/python op.py 
    Lancement de la commande
    Attente
    Sortie
    0 S  1000  3245  3037  0  80   0 -   981 wait   ?        00:00:00 python
    0 S  1000  3384  3245  0  80   0 -  5035 wait   ?        00:00:00 python
    0 S  1000  3399  3398  0  80   0 -  7087 poll   ?        00:00:00 python2.6
    0 S  1000 11856  3778  0  80   0 -  1512 pipe_w pts/0    00:00:00 python
     
    Lancement de la commande avec shell
    Attente
    Sortie
    0 S  1000  3245  3037  0  80   0 -   981 wait   ?        00:00:00 python
    0 S  1000  3384  3245  0  80   0 -  5035 wait   ?        00:00:00 python
    0 S  1000  3399  3398  0  80   0 -  7087 poll   ?        00:00:00 python2.6
    0 S  1000 11856  3778  0  80   0 -  1512 pipe_w pts/0    00:00:00 python
     
    patrice@Zeus:~/Bureau$
    @+

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    Un pipe ? Non :
    Merci de la demonstration!

    -Mais du coup c'est bien comme je le pense: la commande écrit sur la sortie de façon indépendante à python?
    -Peut êtr existe-il une fonction qui bufferise toutes les sorties qui pourrait palier à ce manque?

    Sinon que faire?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 691
    Par défaut
    Citation Envoyé par ugo188 Voir le message
    Merci de la demonstration!

    -Mais du coup c'est bien comme je le pense: la commande écrit sur la sortie de façon indépendante à python?
    -Peut êtr existe-il une fonction qui bufferise toutes les sorties qui pourrait palier à ce manque?

    Sinon que faire?
    Hey!!!
    Relisez le script...
    Suivez l'assignation et le print de "output"
    Et reposez votre question!
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    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
    Citation Envoyé par ugo188 Voir le message
    Merci de la demonstration!

    -Mais du coup c'est bien comme je le pense: la commande écrit sur la sortie de façon indépendante à python?
    -Peut êtr existe-il une fonction qui bufferise toutes les sorties qui pourrait palier à ce manque?

    Sinon que faire?
    ?

    Citation Envoyé par PauseKawa Voir le message
    op.py :print ("Attente") # Pour montrer que ce n'est pas la sortie standard
    sleep(2.0)
    Ou alors je n'ai pas compris.

    C'est le communicate qui te pose problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from subprocess import Popen, PIPE
    from os import getcwd
    from time import sleep
    from os.path import join
     
    print ("Lancement de la commande")
    output = Popen([join(getcwd(), "test.sh")], shell=True, stdout=PIPE).stdout
    print ("Attente") # Pour montrer que ce n'est pas la sortie standard
    sleep(2.0)
    print ("Sortie :")
    for elems in output:
        print (elems)

  10. #10
    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
    Citation Envoyé par ugo188 Voir le message
    Y a-t-il un moyen pour moi de quand même savoir si la commande a échouée ou pas?
    communicate(input=None)
    Interact with process: Send data to stdin. Read data from stdout
    and stderr
    , until end-of-file is reached. Wait for process to
    terminate
    . The optional stdin argument should be a string to be
    sent to the child process, or None, if no data should be sent to
    the child.

    communicate() returns a tuple (stdout, stderr).

    Note: The data read is buffered in memory, so do not use this
    method if the data size is large or unlimited.

    The following attributes are also available:

    stdin
    If the stdin argument is PIPE, this attribute is a file object
    that provides input to the child process. Otherwise, it is None.

    stdout
    If the stdout argument is PIPE, this attribute is a file object
    that provides output from the child process. Otherwise, it is
    None.

    stderr
    If the stderr argument is PIPE, this attribute is file object that
    provides error output from the child process
    . Otherwise, it is
    None.

    Application :

    test.sh:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    ps -Al | grep python
    monerreur
    op.py:
    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
    from subprocess import Popen, PIPE
    from os import getcwd
    from time import sleep
    from os.path import join
     
    print ("Lancement de la commande")
    output = Popen([join(getcwd(), "test.sh")], stdout=PIPE, stderr=PIPE).communicate()
     
    print ("Attente")
    sleep(2.0)
     
    print ("Sortie")
    sleep(1.0)
    for elem in output:
        print elem
    Sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    patrice@Zeus:~/Bureau$ python op.py 
    Lancement de la commande
    Attente
    Sortie
    0 S  1000  3245  3037  0  80   0 -   981 wait   ?        00:00:00 python
    0 S  1000  3384  3245  0  80   0 -  5035 wait   ?        00:00:00 python
    0 S  1000  3399  3398  0  80   0 -  7087 poll   ?        00:00:00 python2.6
    0 S  1000 17165 16610  0  80   0 -   983 wait   pts/0    00:00:00 python
    0 S  1000 17166 17165  0  80   0 -  5034 wait   pts/0    00:00:00 python
    0 S  1000 17171 17170  0  80   0 -  1510 select pts/0    00:00:00 python2.6
     
    /home/patrice/Bureau/test.sh: line 3: monerreur : commande introuvable

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    Je tiens à vous remercier pour toutes l'aide que vous m'avez apportée.

    Cependant les differents tests que j'ai fais, n'ont pas était couronné de succès.
    Je n'arrive pas à récuperer le message d'erreur quand la commande plante.

    J'imagine que celle-ci écrit de façon indépendante à Python sur la sortie d'erreur. C'est possible non?

    Car je comprends tout à fait les tests que vous avez fait -et suis d'accord avec vous-, ainsi que ceux fait chez moi.
    Mais rien n'y fait.

    En revanche j'ai trouvé la solution en trouvant une commande équivalente dans la lib de Python, et là j'arrive à récuperer la sortie en cas d'erreur.

    Je pense donc que le problème est résolu!

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    Voici ce que je fais moi:

    test.sh: (volontairement invalid; cf "free.f")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #!/bin/bash
    echo "some_text" | mail -s subject dest@free.fr -a From:me@free.f
    show.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from subprocess import Popen, PIPE
    from os import waitpid, getcwd
    from time import sleep
    from os.path import join
     
    print ("Lancement de la commande")
    output = Popen([join(getcwd(), "test.sh")], shell=True, stdout=PIPE).communicate()[0]
    print ("Attente") # Pour montrer que ce n'est pas la sortie standard
    sleep(2.0)
     
    print ("Sortie")
    sleep(1.0)
    print output
    Sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    UgO::Larva> python show.py
    Lancement de la commande
    send-mail: 553 5.1.8 <me@free.f>: Sender address rejected: Domain not found
    Can not send mail: sendmail process failed with error code 1
    Attente
    Sortie
    Voilà j'espère avoir bien illustré mon exemple?
    Ou y a peut être quelque chose qui m'echappe...

    C'est donc pour cela que dans le post précédent je précise mettre servi d'une fonction faisant partie de la lib Python!

    Donc si j'arrivais à comprendre pourquoi cela fait ca, plutôt que ce que je voudrais se serait super!
    Cependant je considère déjà le problème comme résolu...

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 691
    Par défaut
    Salut,

    Cependant les differents tests que j'ai fais, n'ont pas était couronné de succès. Je n'arrive pas à récuperer le message d'erreur quand la commande plante.
    Si vous ne prenez pas la peine de nous montrer un exemple de code et nous expliquer ce que vous attendiez, il ne sera pas facile de vous aider.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    Si vous ne prenez pas la peine de nous montrer un exemple de code ET nous expliquer ce que vous attendiez, il ne sera pas facile de vous aider.
    Certes, il est vrai que j'aurais pu m'exprimer plus correctement.
    Mais j'avais quand même demandé dans mon premier post:
    Voilà, donc ce que j'aimerais c'est executer une commande: cat, mail, ps....
    Peu importe la fonction exec, call, system...mais de façon à ce que je connaisse le retour du fils!
    Là ce sont les methodes essayée, je pensais que mettre tous les tests fait aurait été trop lourd, c'est pour cela que j'ai simplement cité les fonctions que j'ai testée:
    J'ai testé avec des wait, waitpid, system, popen, fork...
    Selon les fonctions testée cela ressemblait plus ou moins a cela:
    (Ceci étant en C, exactement ce que je veux faire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      if ((pid = fork()) < 0)
        printf("Erreur at \"fork\"\n");
      if (pid > 0)
        {
          code = wait(&status);
          // On connait le vrai retour du fils! :D
        }
      else
        execve(path, command, env);
    Donc, désolé si je n'ai pas été plus précis. Je pensais que ce que je demandais était compréhensible. De plus toute l'aide que vous avez pu me donner allait dans le sens de ma demande.
    Sinon je serais revenu sur mes attentes, pour plus de précision.

    Je pense qu'au final il s'agissait plus de la commande qu'on execute, plutôt que de la forme en elle-même de l'execution. Car si les codes testé marche avec certaine commande, ce n'est pas vrai pour toutes.

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 691
    Par défaut
    Désolé!

    Je pensais (sans doute naïvement) que le code de PauseKawa répondait à vos questions i.e. oubliez fork et utilisez la bibliothèque standard subprocess
    et plus particulièrement Popen, PIPE.

    L'exemple ne fait sans doute pas ce que vous voulez... mais vous ne dites toujours pas ce qu'il ne fait pas.
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    Attention!
    L'exemple d'ego188 ne fait sans doute pas ce que vous voulez... mais vous ne dites toujours pas ce qu'il ne fait pas.
    Ce n'est pas ego188 mais ugo188.
    Et c'est moi même qui ait créée le sujet.

    Ce que je vous montre est le reflet de ce que cela ne fait pas!
    (Le test suivant a aussi été testé avec stderr)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UgO::Larva> python show.py
    Lancement de la commande
    send-mail: 553 5.1.8 <me@free.f>: Sender address rejected: Domain not found
    Can not send mail: sendmail process failed with error code 1
    Attente
    Sortie
    Est différent de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    patrice@Zeus:~/Bureau$ python op.py 
    Lancement de la commande
    Attente
    Sortie
    0 S  1000  3245  3037  0  80   0 -   981 wait   ?        00:00:00 python
    0 S  1000  3384  3245  0  80   0 -  5035 wait   ?        00:00:00 python
    0 S  1000  3399  3398  0  80   0 -  7087 poll   ?        00:00:00 python2.6
    0 S  1000 17165 16610  0  80   0 -   983 wait   pts/0    00:00:00 python
    0 S  1000 17166 17165  0  80   0 -  5034 wait   pts/0    00:00:00 python
    0 S  1000 17171 17170  0  80   0 -  1510 select pts/0    00:00:00 python2.6
    En effet la commande que je veux exécuter écrit sur la sortie avant même avoir fait le Ce qui est le problème d'origine, à savoir récuperer la façon dont s'est terminé mon fils.

    Encore une fois, j'ai finis par "résoudre" ce problème en utilisant des fonctions de Python. Mais c'est interessant de savoir que ca ne marche pas tout le temps.

    Si quelqu'un dispose tout de même d'une solution à mon problème, je reste preneur!

  17. #17
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 691
    Par défaut
    pardon d'avoir confondu PauseKawa et vous même: je m'exerce aux joies d'un NetPC et l'IHM me joue des tours - je vais corriger çà.
    Avec un vrai truc, j'espère que ca ira mieux.

    Reprenons la 2ème version du code de PauseKawa, vous y remarquerez qu'il a ajouté stderr=PIPE dans son Popen.

    Communicate retourne le 'uplet' (stdout, stderr)

    Code python : 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
    from subprocess import Popen, PIPE
    from os import getcwd
    from time import sleep
    from os.path import join
     
    print ("** Lancement de la commande")
    command = Popen([join(getcwd(), "test.bat")], stdout=PIPE, stderr=PIPE)
    output, errors = command.communicate() 
    print ("** Attente")
    sleep(2.0)
     
    print ("** Sortie")
    sleep(1.0)
    print '<< output >>'
    print output
    print '<< errors >>'
    print errors

    La sortie est de la forme (je l'ai éditée):
    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
    ** Lancement de la commande
    ** Attente
    ** Sortie
    << output >>
    c:\py_works\dev>dir
     Volume in drive C is E-Client
     Volume Serial Number is C7A0-DA2A
    Directory of c:\py_works\dev
    
    25/01/2010  20:59    <DIR>          .
    25/01/2010  20:59    <DIR>          ..
    ...
    25/01/2010  20:59               564 op.py
    25/01/2010  20:44                16 test.bat
    25/01/2010  20:43                16 test.sh
    ...
                  29 File(s)         74*041 bytes
                   3 Dir(s)  19*571*658*752 bytes free
    
    c:\py_works\dev>monerreur
    
    << errors >>
    'monerreur' is not recognized as an internal or external command,
    
    operable program or batch file.
    Le .bat(*) fait simplement:
    (*) Ma bête OSX est en panne! Me voilà réduit à XP.

    Relisez la doc et la note:

    Popen.communicate(input=None)
    Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child.

    communicate() returns a tuple (stdout, stderr).

    Note that if you want to send data to the process’s stdin, you need to create the Popen object with stdin=PIPE. Similarly, to get anything other than None in the result tuple, you need to give stdout=PIPE and/or stderr=PIPE too.

    Note

    The data read is buffered in memory, so do not use this method if the data size is large or unlimited.

    Ca ne fait pas quoi?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    pardon d'avoir confondu PauseKawa et vous même: je m'exerce aux joies d'un NetPC et l'IHM me joue des tours - je vais corriger çà.
    Y a pas de mal!
    L'écorchement du login étant plus dérangeant que la confusion; mais c'est pas bien grave, ça arrive à tout le monde!

    Et sinon j'ai bien noté le stderr, dans le second exemple:
    Ce que je vous montre est le reflet de ce que cela ne fait pas!
    (Le test suivant a aussi été testé avec stderr)
    Quant à la doc et aux exemples je suis tout à fait en accord, mais le problème demeure.
    A savoir:
    UgO::Larva> python show.py
    Lancement de la commande
    send-mail: 553 5.1.8 <me@free.f>: Sender address rejected: Domain not found
    Can not send mail: sendmail process failed with error code 1
    Attente
    Sortie
    La sortie du message d'erreur apparait toujours avant, avec cette commande : mail, de ssmtp.

    Donc à moins que quelqu'un ait aussi rencontré le même problème sur cette commande (ou une autre, peu importe), je ne sais pas comment faire pour ce cas ci.

    Car je le rappel, j'ai finit par me servir de fonction de Python

    Donc c'est pas curiosité et interêt que je continue à me demander si il existe une solution!

  19. #19
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 691
    Par défaut
    ou est votre code?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    Quelques posts avant:

    Voici ce que je fais moi:

    test.sh: (volontairement invalid; cf "free.f")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/bash
    echo "some_text" | mail -s subject dest@free.fr -a From:me@free.f
    show.py:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from subprocess import Popen, PIPE
    from os import waitpid, getcwd
    from time import sleep
    from os.path import join
     
    print ("Lancement de la commande")
    output = Popen([join(getcwd(), "test.sh")], shell=True, stdout=PIPE).communicate()[0]
    print ("Attente") # Pour montrer que ce n'est pas la sortie standard
    sleep(2.0)
     
    print ("Sortie")
    sleep(1.0)
    print output

    Sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UgO::Larva> python show.py
    Lancement de la commande
    send-mail: 553 5.1.8 <me@free.f>: Sender address rejected: Domain not found
    Can not send mail: sendmail process failed with error code 1
    Attente
    Sortie
    Plus d'autre tests (cf. posts précédents) menant au même résultat.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Fork & wait(0)
    Par stoner dans le forum Débuter
    Réponses: 7
    Dernier message: 14/02/2013, 02h38
  2. [debutant] fork et wait
    Par nyakooza dans le forum Linux
    Réponses: 4
    Dernier message: 26/08/2008, 21h27
  3. fork() wait() waitpid() et companie
    Par guillaume_60 dans le forum POSIX
    Réponses: 3
    Dernier message: 23/05/2006, 12h03
  4. fork wait
    Par lafracas dans le forum POSIX
    Réponses: 2
    Dernier message: 19/03/2005, 11h57
  5. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 12h15

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