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

Interfaçage autre langage Python Discussion :

Python C API: Comment quitter PyRun_InteractiveLoop() ?


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Points : 54
    Points
    54
    Par défaut Python C API: Comment quitter PyRun_InteractiveLoop() ?
    Bonjour a tous,

    J'ai ecrit une petite appli en C et en utilisant pthread pour le multithreading.
    Dans un thread, j'ai une session OpenGL qui tourne (avec GLUT) pour afficher mes objects et dans un autre thread, j'ai une session python
    "embedded" dans mon code C qui tourne avec la tres pratique fonction PyRun_InteractiveLoop(). Celle-ci delivre tous simplement le shell de python ce qui est tres pratique pour scripter ma scene OpenGL.

    Mon probleme est de quitter mon programme correctement! Je voudrais donner a l'utilisateur la possibilite de quitter le programme a partir de la fenetre OpenGL (en simplement fermant la fenetre par example) ET a partir du shell python.

    A partir de Python, si l'utilisateur tape "exit()" ou presse "Ctr-D", la fonction PyRun_InteractiveLoop() exit et je peux alors appeler Py_Finalize() et quitter le thread pour revenir au main et quitter avec le flag "quit_main_switch" :

    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
     
     
       Py_Initialize(); 
     
          PyRun_SimpleString("import sys");
          PyRun_SimpleString("import os");
          PyRun_SimpleString("import readline");
     
          PyRun_InteractiveLoop(stdin,"<stdin>");
     
       Py_Finalize();
     
       quit_main_switch = 1;
     
       pthread_exit(NULL);
    avec dans le main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    while(1){  //representant la boucle OpenGL
       if(quit_main_switch){
          exit(0);
       }
    }
    Par contre, a partir d'OpenGL, je rencontre un petit probleme: lorsque je termine la session OpenGL, il me bien evidement aussi terminer la session python qui tourne encore dans l'autre thread. Comment faire ca ?
    J'ai bien essayer de faire un simple thread_cancel() et thread_exit(), mais cela equivaut a un exit(0) sur le thread et empeche une termination normale de la session python (avec Py_Finalize(), etc...). Cela provoque un probleme avec le bash shell duquel l'appli fut lancee et je dois faire un "stty sane" ou "reset" pour tous remettre en etat.

    Y-a-t-il une fonction qui permet de terminer PyRun_InteractiveLoop() ?

    j'espere que c'est claire...
    merci d'avance

    David

  2. #2
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Points : 54
    Points
    54
    Par défaut
    La doc du python C API dit ceci:


    int PyRun_InteractiveLoop( FILE *fp, const char *filename)
    This is a simplified interface to PyRun_InteractiveLoopFlags() below, leaving flags set to NULL.

    int PyRun_InteractiveLoopFlags( FILE *fp, const char *filename, PyCompilerFlags *flags)
    Read and execute statements from a file associated with an interactive device until EOF is reached. If filename is NULL, "???" is used instead. The user will be prompted using sys.ps1 and sys.ps2. Returns 0 at EOF.
    Y-aurait-il moyen d'envoyer EOF a stdin pour terminer PyRun_InteractiveLoop() ?

    David

  3. #3
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Points : 54
    Points
    54
    Par défaut
    J'ai trouve une solution a ce probleme que je poste ici au cas ou quelqu'un est interesse...

    En resume, le probleme est (globalement) de ne pouvoir quitter l'appli uniquement a partir de python (via un ctrl-D ou un exit()). En essayant de quitter l'appli a partir du thread qui gere OpenGL, un probleme se pose concernant la boucle infinie du shell python....

    Une solution est d'empecher l'utilisateur de quitter l'appli a partir d'opengl.
    Pour cela, j'ai du changer GLUT pour freeGLUT qui permet de gerer les evenements tels que la fermeture de la fenetre (en cliquant sur le 'x') grace a une callback function: On peut meme rajouter un printf pour avertir l'utilisateur que cette operation n'est plus possible. Finalement, pour ne pas quitter l'appli, il suffit de rajouter un appel a boucle principle de freeGLUT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void closing()
    {
     
       fprintf(stdout,"To exit, please press Ctrl-D or type exit()\n");
       glutMainLoop();
     
    }
    voila.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment quitter l'explorateur..?
    Par sagitarium dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/11/2006, 18h05
  2. Réponses: 7
    Dernier message: 20/08/2006, 01h48
  3. comment quitter deux boucles for?
    Par davmaster62 dans le forum Général Python
    Réponses: 2
    Dernier message: 08/03/2006, 00h16
  4. [API]Comment ne pas bloquer la fenêtre principal...
    Par X-K4l1 dans le forum Windows
    Réponses: 1
    Dernier message: 16/08/2005, 14h10
  5. [API] Comment obtenir le statut d'un lecteur de cdrom ?
    Par istice dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 07/02/2005, 19h02

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