Eccezioni Boost.Python e Python
-
06-07-2019 - |
Domanda
Come posso rendere consapevoli le eccezioni del codice boost.python python?
Ad esempio,
int test_for(){
for(;;){
}
return 0;
}
non si interrompe su Ctrl-C, se lo esporto in Python. Penso ad altre eccezioni non funzionerà in questo modo.
Questo è un esempio di giocattolo. Il mio vero problema è che ho una funzione C che può richiedere ore per il calcolo. E voglio interromperlo, se per esempio impiega più di quell'ora. Ma non voglio uccidere l'istanza di Python, all'interno della funzione è stata chiamata.
Grazie in anticipo.
Soluzione
Nel tuo codice C o C ++, installa un gestore di segnali per SIGINT che imposta un flag globale e chiedi alla tua funzione di lunga durata di controllarlo periodicamente e tornare presto quando il flag è impostato. In alternativa, invece di un ritorno anticipato, puoi sollevare un'eccezione Python usando l'API Python C: vedi PyErr_SetInterrupt qui .
Altri suggerimenti
Non sono sicuro che boost.python abbia una soluzione - potresti dover affrontare questo da solo. Nel qual caso non è diverso dalla gestione del segnale convenzionale. La soluzione semplice è avere una variabile globale che viene modificata dal gestore del segnale e controllano questa variabile regolarmente . L'altra soluzione è usare setjmp / longjmp, ma penso che il primo modo sia il migliore quando applicabile, perché è semplice e molto più gestibile.
Nota che questo è unix specifico: non so come funziona su Windows.