I'm trying to call cython (cdef) function in C program. When the cdef function contains python statements, e.g. print(0.5), or python (def) functions, calling the (cdef) function raises a segmentation fault.
The .pyx file:
# cython: language_level=3
cdef public double PI = 3.1415926
cdef public double get_e():
print("calling get_e()")
return 2.718281828
The .c file:
#include "Python.h"
#include "transcendentals.h"
#include <math.h>
#include <stdio.h>
int main(int argc, char **argv) {
Py_Initialize();
PyInit_transcendentals();
printf("pi**e: %f
", pow(PI, get_e()));
Py_Finalize();
return 0;
}
The compiling commands:
cython transcendentals.pyx
gcc -I. -I/usr/include/python3.5m -I/usr/include/python3.5m
-Wno-unused-result -Wsign-compare
-g -fstack-protector-strong -Wformat
-Werror=format-security -DNDEBUG -g
-fwrapv -O3 -Wall -Wstrict-prototypes
-L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu
-L/usr/lib transcendentals.c main.c
-lpython3.5m -lpthread -ldl -lutil -lm -Xlinker
-export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions
When I remove the print statement of get_e function, no segmentation fault would be raised. But the value of PI will be 0.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…