Topic: Embedded Python: sys.exit() chiude l'applicazione  (Letto 1718 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline BrownB

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Embedded Python: sys.exit() chiude l'applicazione
« il: Dicembre 24, 2009, 09:41 »
Salve a tutti,
sto usando l'interprete Python linkato con il mio eseguibile scritto con VC++ 6.0, ed ho il problema che se nello script eseguito richiamo "sys.exit()", viene terminato anche il mio programma. La chiamata è la seguente:
[hlpycode]
   Py_Initialize();

   if( ! m_strScriptFname_ONINIT.IsEmpty())
   {
      try
      {
         PyObject* pyFileObject = PyFile_FromString( (LPSTR)(LPCTSTR)m_strScriptFname_ONINIT, "r");
         if( pyFileObject != NULL )
         {
            
            PyObject *pyModule;

            pyModule = PyImport_ImportModule( "time" );
            if( pyModule == NULL )
               throw CString("time");

            pyModule = PyImport_ImportModule( "sys" );
            if( pyModule == NULL )
               throw CString("sys");

            pyModule = PyImport_ImportModule( "win32api" );
            if( pyModule == NULL )
               throw CString("win32api");

            pyModule = PyImport_ImportModule( "win32ui" );
            if( pyModule == NULL )
               throw CString("win32ui");

            int res = PyRun_SimpleFile(PyFile_AsFile(pyFileObject), m_strScriptFname_ONINIT );
            Py_DECREF( pyFileObject );
         }
      
      }
      catch( CString s )
      {
         CString msg;
         msg.Format("Error importing Python module \"%s\"", s );
         this->LogMessage( msg );
      }
      catch( CException *ex )
      {
         this->LogMessage("Exception executing python script.");
      }
   }
[/hlpycode]

Lo script caricato è il seguente (è uno script di prova):
[hlpycode]
import time
import sys
import win32api
import win32ui

sys.exit(1)

[/hlpycode]
forse dovrei chiamare una funzione nello script e usare "return" anziché eseguire lo script?

Nota dello staff: Usare il tag hlpycode per il codice please.
« Ultima modifica: Dicembre 24, 2009, 13:10 da Markon »

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4.104
  • Punti reputazione: 5
    • Mostra profilo
    • Neolithic
Re: Embedded Python: sys.exit() chiude l'applicazione
« Risposta #1 il: Dicembre 24, 2009, 13:21 »
Ciao!

Se quindi ho capito bene tu non vuoi che l'interprete embeddato nel tuo programma python venga terminato quando viene chiamata una sys.exit dall'interno di uno script. Vero?
Insomma, vuoi che l'interprete sia ancora attivo, anche dopo aver terminato lo script?

Purtroppo sys.exit è una systemcall, che svuota buffer e quant'altro.
*credo* che lanciando un tuo script da un interprete python embeddato nel programma "complessivo" vengano condivise le risorse, e di conseguenza una sys.exit terminerà tutto.

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: Embedded Python: sys.exit() chiude l'applicazione
« Risposta #2 il: Dicembre 24, 2009, 13:47 »
Quello che *credo* si possa fare, e' ridefinire exit().
Ma siamo nei dintorni di pesanti violazioni della convenzione di Ginevra.

 Inoltre, non credo sia necessario precaricare i moduli e non
farlo direttamente dal codice Python.

Tornando al tuo problema, mi risulta che il comportamento sia
quello giusto. Python vive nello stesso processo del tuo codice.
sys.exit sotto chiama exit(3), ergo deve proprio uscirsene tutto.

Prova a vedere PyRun_SimpleFileExFlags cosa dice.
Investiga qui:
http://www.mail-archive.com/python-list@python.org/msg251588.html