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 :

Lancement de shell depuis python


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Lancement de shell depuis python
    Bonjour,
    J’ai un script* python qui génère puis exécute un script shell. Ce script shell doit absolument être sourcé. Pour ca j’utilse la commande*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.call(["command",".",str(ShellFilePath)],shell=True)
    ou ShellFilePath est le path de mon shell (en l’occurrence /tmp/chWS.sh). Il se trouve qu’à la fin de ce shell il y a un ‘cd’ vers un Path. Hors, quand j’exécute le script python, je n’ai pas changé de directory à la fin. Par contre, si je lance directement après le script*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $>command . /tmp/chWS.sh
    Tout se passe bien. J’ai instrumenté le script python en appelant ‘os.spawnlp(os.P_WAIT, 'pwd','pwd')’ avant et après subprocess.call, et la directory correspond toujours à celle d’où est lancé le script python. Pour info j’ai également essayé les syntaxes suivante*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cmdToExec='command . '+str(ShellFilePath)
    os.system(cmdToExec) //KO
    os.spawnlp(os.P_WAIT,cmdToExec,cmdToExec) //KO
    subprocess.Popen(str(cmdToExec),0,None,None,None,subprocess.STDOUT,None,False,True,None,None,False,None,0) //KO
    J’ai l’impression que tout se passe comme si mon shell était exécuté dans un terminal autre que celui d’où est lancé mon script python.
    Quelqu'un peut-il me dépanner?
    D'avance merci.

  2. #2
    Membre éprouvé

    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
    Points : 1 273
    Points
    1 273
    Par défaut
    Je ne suis pas sûr de moi, mais à mon avis, il n’y a pas de solution…

    Quelle que soit la méthode, ton script shell sera exécuté dans un autre processus, donc dans un autre shell…

    [EDIT] À la réflexion, il y a peut-être une solution, mais je ne m’y connais pas assez en bash pour en être sûr, donc ce n’est qu’une idée*: un script shell doit pouvoir récupérer l’id de son processus parent, et peut-être peut-il en changer le cwd…

    Mais pourquoi donc ne pas, dans ce cas, utiliser os.chdir(), tout simplement*?

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Merci pour la réponse.
    En fait je ne suis pas le propriétaire du programme générant le script. Celui-ci est génère de telle sorte qu'il soit exécutable sur toute plate-forme. du coup je ne suis pas censé savoir ce qu'il y a dedans. En l'occurrence je savais qu'il terminait par un 'cd' donc j'ai vu le problème. De plus dans ce shell il y a des variables de positionnée, donc si je comprends ce que tu dis, sortie du shell elles ne seront pas positionnées dans le terminal qui exécute mon script python ??

  4. #4
    Membre éprouvé

    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
    Points : 1 273
    Points
    1 273
    Par défaut
    Citation Envoyé par crashXpert Voir le message
    De plus dans ce shell il y a des variables de positionnée, donc si je comprends ce que tu dis, sortie du shell elles ne seront pas positionnées dans le terminal qui exécute mon script python ??
    Je crains bien que ce soit en effet le cas… Et franchement, je ne vois pas trop comment faire pour lancer un script bash dans le même shell que le script python –*j’aurais même tendance à dire que c’est impossible, même si je ne connais pas suffisamment le sujet pour en être sûr…

  5. #5
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Bonsoir,
    je n'ai pas trop compris le problème.

    Faut-il pouvoir faire quelque chose comme python monScript, puis ensuite avoir tout ce qui est renvoyé par la commande ? Si c'est cela, j'ai peut-être une solution.

  6. #6
    Membre éprouvé

    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
    Points : 1 273
    Points
    1 273
    Par défaut
    Si j’ai bien compris, il utilise un script python pour récupérer un script shell généré automatiquement, lequel script est censé rajouter des variables et changer le wd du shell… Seulement, comme il est lancé depuis python, il affecte un shell-enfant, et pas le shel depuis lequel a été lancé le script python…

    Je sais pas si c’est vraiment plus clair, du coup…

  7. #7
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Hum, comment dire... Pas du tout !

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    merci pour vos efforts,
    C'est exactement ça rambc. Je suis très surpris que ce ne soit pas possible. Dans ce cas, une alternative serait de pouvoir garder un handle sur le terminal où le shell a été exécuté pour pouvoir lancer d'autre commande dedans et bénéficier des variables d'environnements positionnées par le shell? Quelqu'un sait comment faire cela ?

  9. #9
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Bonjour.

    Dans mon programme, j'ai besoin d'appeler LaTeX, et j'ai aussi souhaité avoir une trace de ce que dit LaTeX à mon Terminal. J'utilise ceci :
    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
    27
    28
    29
    30
    31
    32
    #!/usr/bin/env python3
     
    import os
    import subprocess
     
    class latexToPaper(object):
        def __init__(self, pathOfTheFile):
            self.pathOfTheFile = pathOfTheFile
     
    # We find the directory of the LaTeX which is
    # the directory where to put the "paper" files.
            self.fileDirectory = os.path.dirname(pathOfTheFile)
     
        def buildPdf(self):
    # Some explanations.
    #
    #    1) The option "-interaction=nonstopmode" don't stop the Terminal
    #    even if there is an error found by ¨latex.
    #
    #    2) "check_call" allows to catch errors indicated by ¨latex and also
    #    to see the infos given by ¨latex in the Terminal in the flow of
    #    the infos given by ¨pyba.
    #    Source :
    #    http://docs.python.org/py3k/library/subprocess.html#subprocess.call
            subprocess.check_call(
                cwd = self.fileDirectory,
                args = [
                    'pdflatex',
                    '-interaction=nonstopmode',
                    self.pathOfTheFile
                ]
            )
    Tu devrais donc essayer d'utiliser subprocess.check_call .

Discussions similaires

  1. Appel de script shell depuis python
    Par Marc_27 dans le forum Général Python
    Réponses: 0
    Dernier message: 15/04/2015, 11h06
  2. lancement d'un shell depuis sunopsis
    Par sebastien00 dans le forum ODI (ex-Sunopsis)
    Réponses: 2
    Dernier message: 03/07/2008, 14h29
  3. Lancement Job SAP depuis shell unix
    Par AurelGTS dans le forum SAP
    Réponses: 0
    Dernier message: 17/06/2008, 18h05
  4. Execution d'un shell depuis Python
    Par Billette dans le forum Général Python
    Réponses: 3
    Dernier message: 05/09/2007, 09h01
  5. Lancement d'un shell depuis un systeme windows
    Par kimlee dans le forum Administration système
    Réponses: 5
    Dernier message: 14/11/2006, 17h21

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