Ich möchte .so Datei von Python erstellen und die .so-Datei in C ausführen, um es zu tun pflegte ich cython .pyx zu konvertieren zu .soVerwenden numpy mit Cython
## print_me.pyx
cimport numpy as cnp
import numpy as np
cimport cython
cpdef public char* print_me(f):
# I know this numpy line does nothing
cdef cnp.ndarray[cnp.complex128_t, ndim=3] a = np.zeros((3,3,3), dtype=np.complex128)
return f
Dann habe ich Setup .py tatsächlich
## setup.py
from distutils.core import setup
from Cython.Build import cythonize
import numpy as np
setup(
ext_modules=cythonize("print_me.pyx"),
include_dirs=[np.get_include()]
)
Durch das Ausführen die folgende Befehlszeile, um .so zu konvertieren .pyx konnte ich .so Datei
python setup.py build_ext --inplace
erstellen 210
Wenn ich versucht habe, so Datei mit dem folgenden C-Code auszuführen, habe ich einen Segmentation Fault.
/* toloadso.c */
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <time.h>
#include <python2.7/Python.h>
int main(void)
{
// define function
void *handle;
char* (*print_me)(PyObject*);
char *error;
PyObject* filename = PyString_FromString("hello");
// load so file
handle = dlopen("./print_me.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror();
// get function handler from so file
print_me = (char* (*)(PyObject*))dlsym(handle, "print_me");
// check if handler got error
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
// execute loaded function
printf("%s\n", (char*)(*print_me)(filename));
dlclose(handle);
exit(EXIT_SUCCESS);
}
ich diese C-Datei mit folgendem Befehl kompiliert:
gcc -fPIC -I/usr/include/ -o toloadso toloadso.c -lpython2.7 -ldl
(It compiled without error or warning)
Als ich versuchte, diesen Code auszuführen, bekam ich einen Segmentation Fault
[[email protected] ~]# ./toloadso
Segmentation fault
Wenn ich den folgenden Kommentar aus Linie in print_me.pyx
cdef cnp.ndarray[cnp.complex128_t, ndim=3] a = np.zeros((3,3,3), dtype=np.complex128)
Mein C-Code läuft ohne Fehler, aber sobald ich diese Zeile auskommentiere, funktioniert es nicht. Ich denke, dass der Versuch, numpy in Cython zu verwenden, irgendwie einen Fehler erzeugt.
Wie kann ich es beheben ?? Ich danke Ihnen so viel für Ihre Antwort
Funktioniert 'print_me.so' als Python-Import? – hpaulj
Ja, es funktioniert auf Python. aber wenn ich die Funktion durch Laden aufrufen.so Datei von c-Datei, es funktioniert nicht :( – jinki