Ответ 1
Помогает ли это? Маленький Гуглинг привел меня сюда!
Вызов функций C из Python - Кристиан Стиген Ларсен
Воспроизведение вышеуказанной ссылки здесь для справки. Я не тестировал код, указанный здесь. Также весь кредит принадлежит автору указанной ссылки.
Вот небольшой учебник о том, как вызывать функции C
из Python
.
Сделайте некоторые простые функции в C. Мы будем называть файл
myModule.c
#include <Python.h>
/*
* Function to be called from Python
*/
static PyObject* py_myFunction(PyObject* self, PyObject* args)
{
char *s = "Hello from C!";
return Py_BuildValue("s", s);
}
/*
* Another function to be called from Python
*/
static PyObject* py_myOtherFunction(PyObject* self, PyObject* args)
{
double x, y;
PyArg_ParseTuple(args, "dd", &x, &y);
return Py_BuildValue("d", x*y);
}
/*
* Bind Python function names to our C functions
*/
static PyMethodDef myModule_methods[] = {
{"myFunction", py_myFunction, METH_VARARGS},
{"myOtherFunction", py_myOtherFunction, METH_VARARGS},
{NULL, NULL}
};
/*
* Python calls this to let us initialize our module
*/
void initmyModule()
{
(void) Py_InitModule("myModule", myModule_methods);
}
Компиляция динамических библиотек в Mac OS X отличается от обычного gcc -расчета, с которым вы могли бы использовать:
gcc -dynamiclib -I/usr/include/python2.3/ -lpython2.3 -o myModule.dylib myModule.c
Теперь вам нужно сделать что-то неловкое; переименуйте myModule.dylib в myModule.so, чтобы Python нашел правильный файл (это ошибка в Python, он должен был быть исправлен, но, насколько мне известно):
mv myModule.dylib myModule.so
Если вы используете систему, которая поддерживает -shared, вы можете просто сделать это:
gcc -shared -I/usr/include/python2.3/ -lpython2.3 -o myModule.so myModule.c
В Windows вы, как сообщается, можете ввести
gcc -shared -IC:\Python27\include -LC:\Python27\libs myModule.c -lpython27 -o myModule.pyd
Здесь простая программа в Python для вызова ваших функций:
from myModule import *
print "Result from myFunction:", myFunction()
print "Result from myOtherFunction(4.0, 5.0):", myOtherFunction(4.0, 5.0)
Вывод:
Result from myFunction(): Hello from C!
Result from myOtherFunction(4.0, 5.0): 20.0
Если вы собираетесь создавать большие библиотеки на Python, я настоятельно рекомендую вам проверить SWIG или Boost Python.