Итак, я хотел бы назвать некоторый код python с c через cython. Мне удалось вызвать код cython с c. И я также могу вызвать код python из cython. Но когда я добавляю все это вместе, некоторые вещи отсутствуют.
Вот мой код python (quacker.pyx
):
def quack():
print "Quack!"
Вот мой "мост" cython (caller.pyx
):
from quacker import quack
cdef public void call_quack():
quack()
И вот код c (main.c
):
#include <Python.h>
#include "caller.h"
int main() {
Py_Initialize();
initcaller();
call_quack();
Py_Finalize();
return 0;
}
Когда я запускаю это, я получаю это исключение:
Exception NameError: "name 'quack' is not defined" in 'caller.call_quack' ignored
Отсутствующие части, которые я подозреваю:
- Я не звонил
initquacker()
- Я не включил
quacker.h
- Cython не производил никаких
quacker.h
-only quacker.c
-
caller.c
не импортируетquacker.h
или вызываетinitquacker()
Я не уверен, что даже можно делать то, что я пытаюсь сделать, но мне кажется, что это должно быть. Я бы хотел услышать любые ваши данные.
Edit:
Вот как я cythonize/compile/link/run:
$ cython *.pyx
$ cc -c *.c -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
$ cc -L/System/Library/Frameworks/Python.framework/Versions/2.7/lib -L/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config -lpython2.7 -ldl *.o -o main
$ ./main