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 :

[Python 3.x] Exécution de scripts externes via GUI


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 11
    Par défaut [Python 3.x] Exécution de scripts externes via GUI
    Bonjour,

    Après de nombreuses recherches sur le net, je n'ai pu trouver la solution répondant à mon problème.

    Je suis en train de développer un outil (avec interface graphique) permettant de lancer des scripts python de projets différents.
    Afin de ne pas avoir de problème de dépendances, je demande à l’utilisateur de cibler le répertoire du projet ainsi que le script qu'il souhaite lancer.

    Pour développer cet outil j'ai donc dans mon IDE un projet "outil_benchmark" qui est le projet intégrant l'IHM, et un projet "projet_test" qui regroupe différents scripts de test à appeler. Evidemment, le but final est que l'outil soit compilé en exécutable et que donc le projet "outil_benchmark" disparaisse de l'IDE.

    Dans mon arborescence "projet_test", j'ai:

    projet_test
    __init__.py
    module_1
    __init__.py
    script_a_lancer.py
    module_2
    __init__.py
    import_particulier.py

    Pour être lancé, le "script_a_lancer.py" importe "import_particulier.py". "import_particulier.py" fait lui appel à de nombreux autres import présents dans "projet_test".

    Lorsque l'utilisateur entre le répertoire du projet à utiliser, j'utilise

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sys.path.append('chemin/du/projet')
    print (sys.path) #le lien a bien ete ajoute au PYTHONPATH
    from module_sous_projet import * #les projets etant gros, j'ai besoin de tout importer en une seule fois
    ...
    proc = subprocess.Popen(['python', 'script_a_lancer.py'])

    La lancement se fait, mais plante dès l'import de "import_particulier.py", me disant que ce module n’existe pas...
    Pourtant, je vérifie bien plus haut que tout le projet fait parti du PYTHONPATH.

    D'où ma question, ai-je oublié quelque chose ou ai-je mal manipulé le package sys ?

    Je m'excuse par avance mais je ne peux pas recopier le code ici, il est sur un pc où toutes les sorties de documents sont bloquées par sécurité. Les lignes sont recopiées à la main.

    Cordialement,

    Poalcospe

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 732
    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 732
    Par défaut
    Citation Envoyé par poalcospe Voir le message
    La lancement se fait, mais plante dès l'import de "import_particulier.py", me disant que ce module n’existe pas...
    Pourtant, je vérifie bien plus haut que tout le projet fait parti du PYTHONPATH.

    D'où ma question, ai-je oublié quelque chose ou ai-je mal manipulé le package sys ?

    Je m'excuse par avance mais je ne peux pas recopier le code ici, il est sur un pc où toutes les sorties de documents sont bloquées par sécurité. Les lignes sont recopiées à la main.
    Il ne devrait pas être compliqué de reproduire les chemins et les bouts de code intéressants "ailleurs" que dans une zone confidentielle.
    En attendant que vous ayez le temps de faire cela et fournir des détails plus précis, sys.path est construit au lancement de l'interpréteur et ne se propage pas dans l'interpréteur crée par subprocess.open. Donc pour autant que les définitions faites soient correctes, inutile de bricoler sys.path de l'appelant.

    note: PYTHONPATH est une variable d'environnement qui servira à construire sys.path

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

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 11
    Par défaut
    Je vais essayé de donner plus de précisions concernant mon code:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    import sys
    import os
    import subprocess
    import PySide
     
    sys.path.append('chemin/du/projet')
    print (sys.path) #le lien a bien ete ajoute au PYTHONPATH
    from module_sous_projet import * #les projets etant gros, j'ai besoin de tout importer en une seule fois
     
    class Benchmark(QtGui.QMainWindow):
     
        def __init__(self,parent=None):
        #initialisation des interfaces graphiques et des signaux
     
        def button(self,MainWindow):
        #construction des buttons, widgets, récupération des valeurs entrées par l'utilisateur
     
        def process(self, new_benchmark): 
            #Lorsque le lien du projet et du script sont référés, le bouton ok active cette fonction
            os.chdir(self.project_path)
            sys.argv = [self.python_script, self.project, self.profile]
            proc = subprocess.Popen(['python', self.python_script])
     
     
     
    if __name__=='__main__':
        app = QtGui.QApplication(sys.argv)
        MainWindow = Benchmark()
        MainWindow.show()
        sys.exit(app.exec_())

    De ce que je comprend, l'utilisation de sys.path avec subprocess ne sert à rien ? Je devrais plutot utiliser subprocess pour indiquer mon environnement et mes arguments, ou bien utiliser sys pour lancer le script c'est bien ça ?

    J'ai du mal à bien comprendre la doc sur subprocess, donc je dois certainement louper des trucs...

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 732
    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 732
    Par défaut
    Salut,

    Citation Envoyé par poalcospe Voir le message
    JDe ce que je comprend, l'utilisation de sys.path avec subprocess ne sert à rien ? Je devrais plutot utiliser subprocess pour indiquer mon environnement et mes arguments, ou bien utiliser sys pour lancer le script c'est bien ça ?
    Popen admet le paramètre env. C'est un dictionnaire. Vous pouvez y passer PYTHONPATH avec le chemin souhaité. Mais comme vos arborescences ne sont pas claires, pas facile d'essayer pour vous.

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

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 11
    Par défaut
    L'arborescence de mon projet est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <outil_benchmark>
        <__init__.py>
        <main.py>
     
    <projet_test>
        <__init__.py>
        <module_1>
            <__init__.py>
            <script_a_lancer.py>
        <module_2>
            <__init__.py>
            <import_particulier.py>
    J'ai essayé de modifier PYTHONPATH mais sans succès avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc = subprocess.Popen(['python', script], env=dict(PYTHONPATH="D:/Projet/.../projet_test"))
    J'espère avoir completé les informations manquantes...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 732
    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 732
    Par défaut
    Salut,

    J'ai fabriqué la structure suivante (et je suis sur Windows):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <<current directory>>
       + test   (folder inside)       
          + main
            __init__.py
            + m1
                __init__.py
                module1.py
            + m2
                __init__.py
                module2.py
    module1 fait "import m2.module2" et print('done')
    module2 fait juste "print(__file_)"
    à la console Windows:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ set PYTHONPATH=
     
    $ python test\main\m1\module1.py
    Traceback (most recent call last):
      File "test\main\m1\module1.py", line 1, in <module>
        import m2.module2
    ImportError: No module named 'm2'
    normal... avec le PYTHONPATH
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ set PYTHONPATH=test\main
    $
    $ python test\main\m1\module1.py
    ...\forum\test\main\m2\module2.py
    done
    La même avec subprocess:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import subprocess as sp
    >>> sp.call('python test\main\m1\module1.py')
    Traceback (most recent call last):
      File "test\main\m1\module1.py", line 1, in <module>
        import m2.module2
    ImportError: No module named 'm2'
    1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> sp.call('python test\main\m1\module1.py', env={'PYTHONPATH': r'test\main'})
    Fatal Python error: Failed to initialize Windows random API (CryptoGen)
    3
    C'est parce qu'il manque des choses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import os
    >>> env = os.environ.copy()
    >>> env['PYTHONPATH'] =  r"test\main"
    >>> sp.call('python test\main\m1\module1.py', env=env, shell=True)
    ...\test\main\m2\module2.py
    done
    0
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/10/2010, 12h16
  2. Exécuter un script cgi via un autre cgi
    Par Olivier Regnier dans le forum Web
    Réponses: 4
    Dernier message: 05/09/2008, 07h47
  3. Exécuter un script shell via le fichier .mailrc
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 16/06/2007, 18h42
  4. Tomcat ne veut pas exécuter un script externe
    Par diamonds dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 14/03/2007, 21h01
  5. exécuter un script externe à java.
    Par diamonds dans le forum EDI et Outils pour Java
    Réponses: 2
    Dernier message: 05/03/2007, 17h46

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