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 :

Appel d'une commande shell // comportement étrange de subprocess.call


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut Appel d'une commande shell // comportement étrange de subprocess.call
    Bonjour à tous !

    Voilà, j'ai un petit problème concernant un bout de code python, quelques mots pour résumer ma situation :

    Je travaille sur la mise en place d'un cluster de machines hudson pour de l'intégration continue, j'ai donc une machine maître "master" et plusieurs esclaves "slave".

    Sur ces machines j'essaye de faire fonctionner via hudson une tâche batch spécifique.

    Cette tâche consiste en un script shell qui va lancer un script python.

    Ce script python lance une commande maven, ce qui donne en gros dans le script python :

    1 - construction du pom.xml (nécessaire pour le lancement de la commande maven)

    2 - exécution de la commande maven via le code python : subprocess.call(lacommande)

    3 - maven crée des dossiers divers pour le traitement

    4 - clean des dossiers de traitement et du pom.xml

    Ce script marche correctement sur le "master", mais rencontre un problème sur les "slaves", en effet sur les "slaves" le subprocess.call(commande) n'attend pas la fin de l'exécution de ladite commande maven et passe donc à l'étape 4 décrite ci dessus sans attendre la fin des étapes 2 et 3, il efface donc le fichier pom.xml avant de pouvoir l'utiliser, ce qui mène à une erreur.

    Bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     retcode = subprocess.call(cmd, shell=True) #lancement de la commande
     copy_results(dir_tmp_project, workspace) #copy des résultats 
     clean_tmp_dir(dir_tmp_project) #clean du workspace et du pom.xml
     return retcode

    Dans la documentation python, il est spécifié que subprocess.call va attendre la fin de la commande avant de passer à la suite, ce qui n'a pas l'air d'être le cas sur les "slaves".

    L'environnement est le même sur le "master" et les "slaves".

    python : version 2.6.4
    Linux red hat 4.1.2

    J'espère que mon explication est assez claire.

    En attente d'idées pour débloquer cette situation !

    Merci d'avance,

    Cordialement,

    Glor.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    qu'est-ce qui te fais dire que l'étape 3 est zappée ?

    ne pas obtenir le résultat attendu ne signifie pas une malfonction ...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    Bonjour, merci de prendre du temps pour me répondre,

    Et bien, le processus principal passe directement à l'étape 4 après le lancement de la commande (étape 2), il efface donc directement le pom.xml. La commande maven lancé (je ne connais pas le fonctionnement de python mais elle doit être lancé dans un processus séparé) va chercher ce fichier et remonter une erreur disant que le fichier pom.xml est introuvable.

    Le passage à l'étape 3 est juste impossible sans le fichier pom.xml.

    En gros le log de sortie donne :

    - passage étape 1
    - passage étape 2
    - passage étape 4
    - impossible de passer à l'étape 3

    L'étape 3 est exécuté dans la commande maven (étape 2), les étapes 1,2 et 4 sont lancés dans le processus principal du script python.

    Ce qui m'a laissé penser que python lance la commande dans un processus secondaire et continu son petit bonhomme de chemin dans le processus principal, alors qu'il devrait attendre la fin du processus secondaire

    Petit schéma de ce qui se passe (d'après moi) :
    PP : processus principal
    PS : processus secondaire



    Petit schéma de ce qui devrait se passer :
    PP : processus principal
    PS : processus secondaire



    Voilà voilà.

    Cordialement,

    Glor.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    et bien, peut-être que le .xml n'est pas effacé, mais juste ...
    -pas créé, ou
    -créé mais pas au bon endroit, ou
    -créé au bon endroit mais pas cherché au bon endroit ...

    les codes sont vraiment identiques? quelle relation entre machine "master" et "slave" ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    Le fichier xml est crée au bon endroit, cherché au bon endroit etc... pour verifier ca, si j'enlève l'étape 4 du script, la commande maven se lance correctement.

    La relation maitre -> esclave est spécifique à hudson, en gros la machine maitre peut déléguer des traitements aux différents esclaves. les scripts utilisés sont les mêmes, les arborescences identiques, et ca sur toutes les machines.

    Le script posant problème est executé en local.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    sur le slave, peut-on exécuter le script sans passer par le master ? pour essayer ...

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

    Citation Envoyé par Glorrrr Voir le message
    Dans la documentation python, il est spécifié que subprocess.call va attendre la fin de la commande avant de passer à la suite, ce qui n'a pas l'air d'être le cas sur les "slaves".
    La fin du process principal. Assez gênant lorsque celui ci lance un sous process sans en attendre le résultat
    Mais je ne pense pas que cela soit le cas pour maven.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retcode = subprocess.call(cmd, shell=True)
    Citation Envoyé par Glorrrr Voir le message
    La commande maven lancé (je ne connais pas le fonctionnement de python mais elle doit être lancé dans un processus séparé) va chercher ce fichier et remonter une erreur disant que le fichier pom.xml est introuvable.
    Citation Envoyé par Glorrrr Voir le message
    Même erreur en l'exécutant depuis le slave.
    Je présume que le test sur le node est fait hors hudson et bien en local.
    En gros vous créez le pom à partir du script Python, et celui ci est bien créer puisque vous l'avez vérifier.
    Ou le créez vous ? En local ? Avez vous essayer de le créer et de lancer ce que vous mettez (exactement) dans cmd dans un shell ?
    Comprendre que le chemin est peut être bon pour Python (sans aucun doute même puisque c'est le script qui fait le pom) mais pas pour maven.

    @+

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    Une petite mise à jour :

    l'utilisation de :

    retcode,output=commands.getstatusoutput(cmd)

    à la place de

    retcode = subprocess.call(cmd, shell=True)

    fonctionne correctement, rien ne vaut une bonne méthode dépréciée .

Discussions similaires

  1. [Système]Execution d'une commande shell
    Par n8ken dans le forum API standards et tierces
    Réponses: 24
    Dernier message: 29/03/2007, 04h36
  2. Problème sur une commande shell
    Par nicolas66 dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 10/07/2006, 21h47
  3. Execution d'une commande Shell Unix
    Par boubakary dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 17/06/2006, 20h36
  4. Récupérer le résultat d'une commande shell
    Par espadon1 dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2006, 10h01
  5. Récupération du résultat d'une commande shell
    Par klu dans le forum Langage
    Réponses: 8
    Dernier message: 16/02/2006, 23h34

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