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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top