Python Extension Programming with C

Bir çox Python paketləri(modulları) C və ya C++ dilləri ilə yazılır.Bu bəhsdə giriş üçün python paketi hazırlayacağıq.

İlk əvvəl iki fayl yaradaq first.c və setup.py

(terminaldan

$ touch first.c

$ touch setup.py

yolu ilə də yarada  bilərik)

Screenshot from 2017-06-29 13-33-46

first.c faylını açırıq aşağıdakı kodları fayla əlavə edirik

Screenshot from 2017-06-29 13-40-09

Kodlara açıqlama verək.

Kökdən python.h faylını include edirik.Daha sonra istifadə olunacaq funksiyamızı hazırlayırıq

integer(PyObject* self, PyObject* args)
{
const int* input_integer;
double reg;

if (!PyArg_ParseTuple(args, “i”, &input_integer))
return NULL;

printf(color_blue “Output : %d\n”,input_integer);
Py_RETURN_NONE;
}

————————————————————————————————————

funksiyamız integer adı ilə istifadə olunacaq.tam ədədləri alacağından veriləni pointer olaraq aşağıdakı şəkildə ifadə edək.

const int* input_integer;

Funksiyanın alacağı dəyər integer olduğundan

if (!PyArg_ParseTuple(args, “i”, &input_integer))

“i” -ilə ifadə etdik(str üçün -s float üçün f olaraq yazılır)

istifadəçinin verdiyi integer dəyəri mavi rənglə çap edək.

printf(color_blue “Output : %d\n”,input_integer);

istifadə edəcəyimiz funksiyanın listəsini tərtib edək

static PyMethodDef show_funcs[] =
{
{“integer”,integer, METH_VARARGS, “”},
{NULL, NULL, 0, NULL}
};

və çağrılacaq funksiyalar üçün əsas predmeti show parametri ilə tərtib edək

PyMODINIT_FUNC
initshow(void)
{
(void) Py_InitModule(“show“, show_funcs);
}

setup.py faylına daxil oluruq

Screenshot from 2017-06-29 13-52-24

Yuxarıdakı kodları fayla əlavə etdikdən sonra yaddaşa veririk və ardından terminalı açırıq

terminaldan faylları açdığımız qovluğa daxil olub

xaos@techaz:~/Programlar/c/C_extension$ sudo python setup.py install yazırıq

Screenshot from 2017-06-29 13-55-14

Və paketimiz show adı ilə python2.7 qovluğu altına yerləşdi.

pythonu çağırırıq

Screenshot from 2017-06-29 13-58-39

paketə dir(show) ilə baxdıqda bir ədəd funksiyamız-integer olduğunu görürük.funksiyadan istifadə edək

Screenshot from 2017-06-29 14-01-56

Sonuncu veriləni string cinsində yazsaqda python bizə xəta olduğu məlumatını verdi.Biz integer funksiyasını yalnız tam ədədlər üçün tərtib etmişik

>> from show import*
>>> integer(12)
Output : 12
>>>

>> integer(45+45)
Output : 90
>>>

Paketimizə string cinsi üçün funksiya əlavə edək

first.c faylına daxil olaraq kiçik dəyişikliklər edək

string(PyObject* self, PyObject* args)
{
const int* input_string;

if (!PyArg_ParseTuple(args, “s”, &input_string))
return NULL;
printf(color_green “Output : \n%s\n”,input_string);

Py_RETURN_NONE;

}

static PyMethodDef show_funcs[] =
{
{“integer”,integer, METH_VARARGS, “”},
{“string”,string, METH_VARARGS, “”},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initshow(void)
{
(void) Py_InitModule(“show”, show_funcs);
}

 

Bütövlükdə kodlarımız

#include <Python.h>
#define color_blue “\x1b[34m”
#define color_green “\x1b[32m”
static PyObject*
integer(PyObject* self, PyObject* args)
{
const int* input_integer;
if (!PyArg_ParseTuple(args, “i”, &input_integer))
return NULL;
printf(color_blue “Output : \n%d\n”,input_integer);
Py_RETURN_NONE;
}
string(PyObject* self, PyObject* args)
{
const int* input_string;
if (!PyArg_ParseTuple(args, “s”, &input_string))
return NULL;
printf(color_green “Output : \n%s\n”,input_string);
Py_RETURN_NONE;
}
static PyMethodDef show_funcs[] =
{
{“integer”,integer, METH_VARARGS, “”},
{“string”,string, METH_VARARGS, “”},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initshow(void)
{
(void) Py_InitModule(“show”, show_funcs);
}

Yaddaşa verib terminaldan

$ sudo python setup.py install

yazırıq

daha sonra python -u çağırırıq

>> import show
>>> dir(show)
[‘__doc__’, ‘__file__’, ‘__name__’, ‘__package__’, ‘integer’, ‘string’]
>>> from show import*
>>> string(“Salam Azerbaijan”)
Output :
Salam Azerbaijan
>>> string(“****”*12)
Output :
************************************************
>>> string(“Hello\n Azerbaijan”)
Output :
Hello
Azerbaijan
>>> string(“Hello \t\t\nAzerbaijan”)
Output :
Hello
Azerbaijan
>>> string(“Hello \t\t\Azerbaijan”)
Output :
Hello \Azerbaijan
>>> string(“Hello \vAzerbaijan”)
Output :
Hello
Azerbaijan
>>> integer(12)
Output :
12
>>> integer(12*12)
Output :
144
>>> print integer(12)
Output :
12
None
>>> print integer(12*12)
Output :
144
None
>>> print integer
<built-in function integer>
>>> i=144
>>> integer(i)
Output :
144
>>> i=”System”
>>> for v in i:
… string(v)

Output :
S
Output :
y
Output :
s
Output :
t
Output :
e
Output :
m
>>>

 

 

Bir şərh yazın