dersblog

Python'dan C Fonksiyonu Cagirmak

Python script icinden C fonksiyonu cagirmak icin sunlar gerekli. Kodun testmod.c dosyasinda oldugunu farzedelim; once bir shared library olusturmamiz lazim. make.sh adinda bir derleme script'i soyle olabilir:

#!/bin/sh
gcc -shared -o testmod.so -I/usr/include/python2.5 -lpython2.5  testmod.c

C fonksiyonu soyle bir dosyada:

include "Python.h"

static PyObject* py_myFunction(PyObject* self, PyObject* args)
{
 char *s = "Hello from C!";
 return Py_BuildValue("s", s);
}

static PyObject* py_myOtherFunction(PyObject* self, PyObject* args)
{
 double x, y;
 PyArg_ParseTuple(args, "dd", &x, &y);
 return Py_BuildValue("d", x*y);
}

static PyMethodDef myModule_methods[] = {
 {"myFunction", py_myFunction, METH_VARARGS},
 {"myOtherFunction", py_myOtherFunction, METH_VARARGS},
 {NULL, NULL}
};

void inittestmod()
{
 (void) Py_InitModule("testmod", myModule_methods);
}

Usttekileri make.sh ile derledikten sonra, bir Python script icinden sunlar isletilebilir:

from testmod import *

print "Result from myFunction:", myFunction()
print "Result from myOtherFunction(4.0, 5.0):", myOtherFunction(4.0, 5.0)

Kodlarin tamami altta

Not: Eger gcc yerine g++ kullanirsaniz, o zaman tum fonksiyonlarin extern "C" { } ile sarilmasi gerekli, cunku g++ derleyicileri derlerken fonksiyon isimlerini degisime ugratiyorlar (mangling), ve Python yorumlayicisi bekledigi cagri isimlerini bulamayinca hata veriyor. Surada.

Not: Bir .so dosyasi, shared library icindeki sembolleri, fonksiyon cagrilarini listelemek icin "nm dosya.so" komutu kullanilabilir.

Kaynak

make.sh

#!/bin/sh
gcc -shared -o testmod.so -g `pkg-config opencv --cflags --libs glib-2.0` -I/usr/include/python2.5 -lpython2.5  testmod.c

testmod.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 inittestmod()

{

 (void) Py_InitModule("testmod", myModule_methods);

}

testmod.py

from testmod import *

print "Result from myFunction:", myFunction()

print "Result from myOtherFunction(4.0, 5.0):", myOtherFunction(4.0, 5.0)

Yukarı