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 :

Exécuter un programme .py par un autre


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 22
    Points : 13
    Points
    13
    Par défaut Exécuter un programme .py par un autre
    Bonjour,

    Je débute dans la programmation python et j'aimerai savoir comme je peux lancer un programme .py par un autre .py. Je m'explique, j'ai une interface graphique qui lancerait un serveur à partir d'un bouton. J'ai les deux codes sources, et ils fonctionnent très bien lorsque je les lance individuellement. Voilà donc maintenant j'aimerai lancer le serveur à partir de mon interface (par exemple le bouton "Lancer")
    Donc, avez-vous une idée ? Sur quoi je me penche ? je ne sais pas quoi taper sur google du coup je tombe sur des choses qui ne m'intéresse pas..

    Merci et bonne soirée !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2014
    Messages : 25
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    tu peux exécuter ton fichier au travers d'une commande.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import os
     
    cmd = 'python fichier.py'
    os.system(cmd)

  3. #3
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Qu'est-ce qui t'empêche d'importer ce module ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par DimKlen Voir le message
    Je débute dans la programmation python et j'aimerai savoir comme je peux lancer un programme .py par un autre .py. Je m'explique, j'ai une interface graphique qui lancerait un serveur à partir d'un bouton. J'ai les deux codes sources, et ils fonctionnent très bien lorsque je les lance individuellement. Voilà donc maintenant j'aimerai lancer le serveur à partir de mon interface (par exemple le bouton "Lancer")
    Les informations importantes sont dans "interface graphique qui lancerait un serveur à partir d'un bouton".
    Un serveur n'est pas supposé terminer rapidement alors que la fonction appelée par le Buton doit terminer le plus rapidement possible pour ne pas geler l'interface graphique. La primitive utilisée pour lancer le serveur devra juste lancer le serveur.

    Un programme .py se lance comme n'importe quel autre programme externe via la fonction Popen de la bibliothèque subprocess où une fonction équivalente fournie par la bibliothèque graphique - dans le cas Qt par exemple.
    On peut aussi lancer le serveur dans le même process que l'interface graphique mais dans ce cas là, il faudra lui attribuer un Thread séparé.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Voilaà c'est ça, je ne veux pas que mon application (mon interface) soit bloquée lorsque je décide de lancer le serveur. Donc tu me dis que Popen pourrait résoudre cela ? Est-il possible d'échanger des informations entre mon programme et le serveur ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par DimKlen Voir le message
    Voilaà c'est ça, je ne veux pas que mon application (mon interface) soit bloquée lorsque je décide de lancer le lanceur. Donc tu me dis que Popen pourrait résoudre cela ? Est-il possible d'échanger des informations entre mon programme et le serveur ?
    Il faut que le serveur s'exécute de manière asynchrone par rapport au GUI.
    Les Thread et subprocess.Popen sont deux façons d'y parvenir.
    Et oui, il est possible d'échanger des données dans les deux cas. Les modalités seront à la base assez différentes: dans un cas(threads) on aura un espace virtuel partagé et dans l'autre (Popen) des espaces virtuels séparés... Pour le reste, tout dépend de la quantité d'information à échanger par unité de temps.

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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Super !! Je me documente sur les threads et apparrament il faut toujours créer une classe ( de ce style class myThread(self,Thread)) avec un constructeur et une méthode run().
    Il n'y a pas plus court et plus simple ? De plus selon leurs exemples, leurs threads sont lancés dans le main, or j'aimerai lancer mon thread une fois qu'on ait cliqué sur un bouton.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par DimKlen Voir le message
    Super !! Je me documente sur les threads et apparrament il faut toujours créer une classe ( de ce style class myThread(self,Thread)) avec un constructeur et une méthode run().
    Continuez à vous documenter car on peut faire sans classe, ni run:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import threading
    >>> def task():
    ...     print ('coucou')
    ...
    >>> threading.Thread(target=task).start()
    coucou
    >>>
    Citation Envoyé par DimKlen Voir le message
    De plus selon leurs exemples, leurs threads sont lancés dans le main, or j'aimerai lancer mon thread une fois qu'on ait cliqué sur un bouton.
    Votre GUI doit s'exécuter dans "main".
    Le "callback" du button sera donc exécuté dans "main".

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

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Oké très bien dans le deux cas ça fonctionne
    Du coup dans mon thread je fais un os.system(cmd) pour exécuter mon serveur. Pour communiquer entre mon GUI et le server ? (échange de string par exemple) Par quoi je passe ? une piste ?

    Merci

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par DimKlen Voir le message
    Du coup dans mon thread je fais un os.system(cmd) pour exécuter mon serveur. Pour communiquer entre mon GUI et le server ? (échange de string par exemple) Par quoi je passe ? une piste ?
    L'avantage de subprocess Popen est d'éviter de créer un thread asynchrone pour masquer le déroulement d'une action synchrone (os.system).
    Pour communiquer, vous avez des canaux d'entrée-sortie "standard" aussi connus comme stdin, stderr, stdout ou plus riche des sockets.
    Dans les 2 cas, vous ne pourrez échanger que des chaines de caractères comme lorsqu'on écrit/lit dans un fichier mais... c'est plus rebelle!

    Pour voir les difficultés vous pourriez regarder (et vous inspirer) du jeu de bombardes en réseau proposé dans le Swinnen.

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

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Ce que je souhaite faire est le même principe que les socket sauf qu'ici j'en utilise pas, donc je me tourne vers les entrées sorties standards.
    Wiztricks pourrais tu m'en dire plus concernant les entrées-sorties standard pour communiquer avec l'autre module ?

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par DimKlen Voir le message
    Wiztricks pourrais tu m'en dire plus concernant les entrées-sorties standard pour communiquer avec l'autre module ?
    Cela fait partie de la documentation de base et vous avez plein de tuto. à votre disposition pour commencer. Un tuto. intéressant est par exemple celui de D.Hellman.. Effectivement çà peut paraître compliqué, mais à vous de prendre le temps d'apprendre.

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

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Bonjour, je continue à développer mon projet tranquillement mais j'ai une autre question.

    J'ai deux modules, un module qui se nomme exemple et l'autre, client.

    J''aimerai lancer le main() du client à partir du module exemple. Donc dans le module exemple.py je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import kaldigstserver.client as cl
    cl.main()
    pour appeler le main() du client.

    Voici le main du client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def main():
     
        parser = argparse.ArgumentParser(description='Command line client for kaldigstserver')
     
        parser.add_argument('-u', '--uri', default="ws://localhost:8888/client/ws/speech", dest="uri", help="Server websocket URI")
        parser.add_argument('-r', '--rate', default=32000, dest="rate", type=int, help="Rate in bytes/sec at which audio should be sent to the server. NB! For raw 16-bit audio it must be 2*samplerate!")
        parser.add_argument('--save-adaptation-state', help="Save adaptation state to file")
        parser.add_argument('--send-adaptation-state', help="Send adaptation state from file")
        parser.add_argument('--content-type', default='', help="Use the specified content type (empty by default, for raw files the default is  audio/x-raw, layout=(string)interleaved, rate=(int)<rate>, format=(string)S16LE, channels=(int)1")
        parser.add_argument('audiofile', help="Audio file to be sent to the server")
        args = parser.parse_args()
    Le problème est que lorsque j'exécute le main du client à partir de cl.main(), j'obtiens une erreur qui est surement lié à un manque d'argument fourni au main().
    L'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client.py: error: too few arguments
    Lorsque je lance ce module depuis la console avec la bonne ligne de commande, tout fonctionne normalement. Voici la ligne de commande exécuté : 'python kaldigstserver/client.py -r 32000 monFichier.raw'

    Donc comme je ne fourni pas cette information lorsque j'appel main() depuis l'autre module, j'aimerai savoir comment je peux ajouter cette information manquante au parser ?

    Merci de vos réponses !

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Ben il faut effectivement passer les arguments à "main":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import sys
    def main(argv=None):
     
        ...
        argv = argv or sys.argv
        args = parser.parse_args(argv)
    et appeler ce main via: cl.main("-r 32000 monFichier.raw".split())

    *edit* et/ou re-travailler un peu votre code pour avoir une fonction "main" qui reçoive de vrais paramètres (par exemple les variables construites par argparse à partir de la ligne de commande) et créer un "main" qui ne sera exécuté que lorsque client.py sera appelé en tant que "programme" via l'"astuce":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if __name__ == '__main__':
       # ici on récupère les arguments de la ligne de commande.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    Membre régulier Avatar de fifafou
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2016
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 173
    Points : 92
    Points
    92
    Par défaut reponse tardive
    Tant pis si le sujet date mais on peut faire:
    ton programme va considerer l'autre comme un module et va créer un programme.pyc pour que ça marche puis executer l'autre.
    Tu peut comme ça créer tes propres modules car toute les fonction de l'autre programme seront alors définies dans celui de base

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par fifafou Voir le message
    Tant pis si le sujet date mais on peut faire:
    ton programme va considerer l'autre comme un module et va créer un programme.pyc pour que ça marche puis executer l'autre.
    Tu peut comme ça créer tes propres modules car toute les fonction de l'autre programme seront alors définies dans celui de base
    C'est déjà ce qui est fait...

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

Discussions similaires

  1. Exécuter un programme Java sur une autre session
    Par Maine13 dans le forum Général Java
    Réponses: 3
    Dernier message: 16/03/2016, 11h04
  2. Exécuter un programme défini par une chaîne de caractère
    Par yop3112 dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 16/06/2015, 14h35
  3. Exécuter un programme ruby sur une autre machine
    Par foulques.nera dans le forum Ruby
    Réponses: 1
    Dernier message: 26/04/2013, 14h14
  4. Réponses: 3
    Dernier message: 31/08/2009, 19h51
  5. Réponses: 9
    Dernier message: 19/08/2004, 11h03

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