Я хотел бы поднять KeyboardInterrupt с расширения C.Как поднять исключение Python из расширения C
В C, я создал модуль с именем siginfo
через ниже + setup.py:
static void siginfo_handler(int signum, siginfo_t *siginfo, void *context) {
printf("got signal from '%d'", siginfo->si_pid);
//raise(PyExc_KeyboardInterrupt) <--- i want to raise keyboard interrupt here
}
static PyObject * siginfo_register(PyObject *self, PyObject *args) {
struct sigaction act;
memset(&act, '\0', sizeof(act));
act.sa_sigaction = &siginfo_handler;
act.sa_flags = SA_SIGINFO;
sigaction(SIGINT, &act, NULL);
PY_RETURN_NONE;
}
static PyMethodDef SiginfoMethods[] = {
//blah blah filled out
};
PyMODINIT_FUNC initsiginfo(void) {
//blah blah filled out
}
В Python:
import siginfo
import os
siginfo.register()
print "talk to me with kill -SIGINT %d" % os.getpid()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print 'got keybaord interrupt'
Расширение C догоняет SIGINT штраф, но я не Не знаю, как извлечь из него исключение Python, чтобы я мог его поймать в коде Python.
Любые идеи?
EDIT:
я узнал, что я могу поднять KeyboardInterrupt по:
PyErr_SetString(PyExc_KeyboardInterrupt, "SIGINT received");
но это сегментный вина, если я поднять его в обработчик сигнала.
это не seg неисправность если поднят в другой функции.
Почему я не могу поднять его в обработчике сигналов?
Я не уверен, что вы можете заставить это работать. Конечно, не из обработчика сигнала. –
@ IgnacioVazquez-Abrams это, безусловно, работает от обработчика сигнала. – tynn