From 79b8d70967a3fba85eb01eb511166b50210d124d Mon Sep 17 00:00:00 2001 From: David Hendriks <davidhendriks93@gmail.com> Date: Wed, 30 Oct 2019 17:08:50 +0000 Subject: [PATCH] makking some c functions and binding them with python --- .python-version | 1 + python-c-api_solution/Makefile | 9 +++++ python-c-api_solution/demolib.c | 25 ++++++++++++ python-c-api_solution/demolib.h | 6 +++ python-c-api_solution/demolib.o | Bin 0 -> 1824 bytes python-c-api_solution/demomodule.c | 63 +++++++++++++++++++++++++++++ python-c-api_solution/main.c | 34 ++++++++++++++++ python-c-api_solution/main.o | Bin 0 -> 1920 bytes python-c-api_solution/setup.py | 11 +++++ python-c-api_solution/test_script | Bin 0 -> 8664 bytes python-c-api_solution/todo.org | 20 +++++++++ python-c-api_solution/todo.org~ | 2 + 12 files changed, 171 insertions(+) create mode 100644 .python-version create mode 100644 python-c-api_solution/Makefile create mode 100644 python-c-api_solution/demolib.c create mode 100644 python-c-api_solution/demolib.h create mode 100644 python-c-api_solution/demolib.o create mode 100644 python-c-api_solution/demomodule.c create mode 100644 python-c-api_solution/main.c create mode 100644 python-c-api_solution/main.o create mode 100644 python-c-api_solution/setup.py create mode 100755 python-c-api_solution/test_script create mode 100644 python-c-api_solution/todo.org create mode 100644 python-c-api_solution/todo.org~ diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..61553c0 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +python-c-interface3.6.4 diff --git a/python-c-api_solution/Makefile b/python-c-api_solution/Makefile new file mode 100644 index 0000000..375d89f --- /dev/null +++ b/python-c-api_solution/Makefile @@ -0,0 +1,9 @@ +#http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/ +CC=gcc +CFLAGS=-I. + +test_script: main.o demolib.o + $(CC) -o test_script main.o demolib.o + +clean: + rm -f *.o \ No newline at end of file diff --git a/python-c-api_solution/demolib.c b/python-c-api_solution/demolib.c new file mode 100644 index 0000000..39d66e9 --- /dev/null +++ b/python-c-api_solution/demolib.c @@ -0,0 +1,25 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "demolib.h" + +int add_number(int number_1, int number_2) { + int result = number_1 + number_2; + return result; +} + +// https://stackoverflow.com/questions/8465006/how-do-i-concatenate-two-strings-in-c + +char* make_str(const char *s1, const char *s2) { + char *result = malloc(strlen(s1) + strlen(s2) + 1); + strcpy(result, s1); + strcat(result, s2); + return result; +} + +int add_number_using_pointer() { + +} + + + diff --git a/python-c-api_solution/demolib.h b/python-c-api_solution/demolib.h new file mode 100644 index 0000000..17ce344 --- /dev/null +++ b/python-c-api_solution/demolib.h @@ -0,0 +1,6 @@ +// Example header file + +// char construct_string(int number); + +int add_number(int number_1, int number_2); +char* make_str(const char *s1, const char *s2); \ No newline at end of file diff --git a/python-c-api_solution/demolib.o b/python-c-api_solution/demolib.o new file mode 100644 index 0000000000000000000000000000000000000000..5896b43ecea3a7fb3097c0b062930226d5bc57dd GIT binary patch literal 1824 zcmbu9-)qxQ6vt26xvA?$6_Mct`yevGg%&5u5a|!n1}PTZ0*Z{7wi%T*?PwF|l<7l3 zh<(|gG^il>)F<gbAoQUxzK9Qnc}{X~dyVPKJmuzl&*z?VZgQHNk4iBgktE<I!4sHy zoB|{kX7jW+O+yTpK~voy?(x`lMm=rZQ%2IjRVF=Uve&1T9kn~&P~GF9>N*3pr=Wfv zQMT&#(H%@(X{dHjrK#&GBekauF=V8=->0~zQIWq9y4^1uulM>;$mO;Z8(P_E*iPc1 zyd@_$Q;z4QKBOMW$t^i`*XMWx*Su!{klwujsS}shV@nrL@WF2)r$KguE}7N%r$}yP zQNsXqZ{v7O9PN-Ud|l~ABl~^~;dw^AU4WlwVe8S*&I3g87iLkc6lPIa48vGuX%4^e z4_`)dRk$Co7s#$N&V8>3$Zp|?;|SUV1Yw+d7{+sR_|rKYs;1Sfzb(rZFsfC(;aFv} z1(tDO>TSCPdZAd#W{P?#pWjh-_1#RisOW$zb+ds{^?I{HUghw}6T`-BJiE`7I!wKo zocWfW!=DR0CdAhSz9R7V0$&w)g7F9{4Q^>R;hgs$<o1ze8)a0x<!g=4T4vplZL?#8 zTs3S1<Z`<Wa;0fmW&>HHX`6E4nYP)sjmiPYUbtD)_gjW#@_qkT6Ig)W`QRIwMn?A8 zm+3Y5?ODea`VZ362!FE1jzov?OQ@7fXOwKs7r28;Ja~e>vGt$?_rHe$RP(&~Da@ss zNgSf_{i(iae1ERnxX9;X+%M4)=E2w!%NO4z3jfV=-Z16D`^SAccVYcMVGZHWMg6C* z3(x2Mr~3)+jR;<{8?7<D%yNVIR5#dr%0FdA`MD!T7JU9I$U^fOeC1`$F2VdiTZG7Z literal 0 HcmV?d00001 diff --git a/python-c-api_solution/demomodule.c b/python-c-api_solution/demomodule.c new file mode 100644 index 0000000..1657aca --- /dev/null +++ b/python-c-api_solution/demomodule.c @@ -0,0 +1,63 @@ +// demomodule.c +#include <Python.h> +#include "demolib.h" + + +// https://stackoverflow.com/questions/51505391/how-to-parse-void-to-pyobject + + +static PyObject *DemoLib_AddNumber(PyObject *self, PyObject *args) { + int *number_1; + int *number_2; + if (!PyArg_ParseTuple(args, "ii", &number_1, &number_2)) { + return NULL; + } + + int result; + result = add_number(number_1, number_2); + + return Py_BuildValue("i", result); +} + +static PyObject *DemoLib_MakeStr(PyObject *self, PyObject *args) { + char *character_1; + char *character_2; + if (!PyArg_ParseTuple(args, "ss", &character_1, &character_2)) { + return NULL; + } + + char* result; + result = make_str(character_1, character_2); + + return Py_BuildValue("s", result); +} + +// module's function table +static PyMethodDef DemoLib_FunctionsTable[] = { + { + "add_number", // name exposed to Python + DemoLib_AddNumber, // C wrapper function + METH_VARARGS, // received variable args (but really just 1) + "adds two numbers" // documentation + }, { + "make_str", // name exposed to Python + DemoLib_MakeStr, // C wrapper function + METH_VARARGS, // received variable args (but really just 1) + "adds two strings" // documentation + }, { + NULL, NULL, 0, NULL + } +}; + +// modules definition +static struct PyModuleDef DemoLib_Module = { + PyModuleDef_HEAD_INIT, + "demo", // name of module exposed to Python + "Demo Python wrapper for custom C extension library.", // module documentation + -1, + DemoLib_FunctionsTable +}; + +PyMODINIT_FUNC PyInit_demo(void) { + return PyModule_Create(&DemoLib_Module); +} \ No newline at end of file diff --git a/python-c-api_solution/main.c b/python-c-api_solution/main.c new file mode 100644 index 0000000..3e05435 --- /dev/null +++ b/python-c-api_solution/main.c @@ -0,0 +1,34 @@ +#include <stdio.h> +#include "demolib.h" + + +int main(void) { + // Testing stuff for add_number function + int getal_1=2; + int getal_2=3; + + int result; + result = add_number(getal_1, getal_2); + printf("%d\n", result); + // + + + // testing stuff for concatenate string function + char* str_1 = "a"; + char* str_2 = "b"; + + char* s = make_str(str_1, str_2); + // do things with s + printf("%s\n", s); + + free(s); // deallocate the string + // + + // testing stuff to + + + + + + return(0); +} \ No newline at end of file diff --git a/python-c-api_solution/main.o b/python-c-api_solution/main.o new file mode 100644 index 0000000000000000000000000000000000000000..e29df7dd325a7b1a79365f68f3ad84979b8f9351 GIT binary patch literal 1920 zcmbu8&ubGw6vy9YYpXS>Q9KCs5D`Ve4hd9@1xtRg$sU4*+Td~7BpX`lZe(`@)q@p8 zVGRZUoE{5;L607ahaP&U(1QoP^&r;wc4yk@W^>VRn7sEs^WK};ncYpTQA;Tb2q~}# zr;(rlr3uLo-4bLV4NX1xuD|(_A8LCk#6xXgMKfsb5462tHy9pLZlE0uw1eQ2zV(R0 zZTbr*^sRH`>w$K7>i*ORO&o}VU7dHpj3Y!xC$Z#*?LL3J)tLqpS^)KGbs=}B+3Guf zKlgymv;174A4Y{&g(Az(v%=ko<I-1YeU$QY8I+BzGMk<{{{au+Ix-rh_w-ku$-YZf zGn1*em_Z;}baoT)>o{pvO*~lu6@N)mu~U*%2v2QfN`<KrMnHw+4XZFYl24geq<x0Z zjx2*CJCY4>a|~x=`28__aSX4H;b5C<4r_-7jCy0KQf?Sawb~PH#aJm<8kzxSr(-yM zyJflX++B10E+(&AhUa74_dV#kmIXJkKZ#EIB97n3k@5sl^itDl3%)=QMfqtQf|m)R zM1B+jG`J%;SyDSPVIMkM(Z`ecjKnu3eo5jv&Z)2H9U|tvuzj-y44*f$tHN`wXD0Kl z4Ify?^i5zb&jaT6qM+TgZOg$qr{`O&{<t~k`DS|^6R6BuHM*{8TYTC7HaYA--%R{X zEFmL__b-Z~T;Y?Q#X)yb!f{6YliJ~M8ZE6OzJzO>-{zdBa|-a~#5?Oy4_Wsxpq~F) zU%*=GdFJjg7VC@sA_^5>{~=Oh;(d*>0KRgE_9si!3tPcS;mdh{<UsP{xleh0eE*_p zQK}_3{yfXblJ0MZAE>w|x<9HF^@7uWM%G4F<Qsj>Eq&V;66%S??+y`c^QJlllH$*Q R8RwGfzj0_vwdBU@{{p3z!QlV^ literal 0 HcmV?d00001 diff --git a/python-c-api_solution/setup.py b/python-c-api_solution/setup.py new file mode 100644 index 0000000..0354312 --- /dev/null +++ b/python-c-api_solution/setup.py @@ -0,0 +1,11 @@ +from setuptools import Extension, setup + +module = Extension("demo", + sources=[ + 'demolib.c', + 'demomodule.c' + ]) +setup(name='demo', + version='1.0', + description='Python wrapper for custom C extension', + ext_modules=[module]) \ No newline at end of file diff --git a/python-c-api_solution/test_script b/python-c-api_solution/test_script new file mode 100755 index 0000000000000000000000000000000000000000..f97b74885b85f148dd55b72354cc0b1763672653 GIT binary patch literal 8664 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 E8&X0gx&QzG literal 0 HcmV?d00001 diff --git a/python-c-api_solution/todo.org b/python-c-api_solution/todo.org new file mode 100644 index 0000000..8911529 --- /dev/null +++ b/python-c-api_solution/todo.org @@ -0,0 +1,20 @@ + +* DONE Construct function in c that returns combines 2 strings + CLOSED: [2019-10-30 Wed 16:59] +* DONE Wrap this in python + CLOSED: [2019-10-30 Wed 16:59] + +* DONE construct a function in c that adds 2 numbers + CLOSED: [2019-10-30 Wed 16:59] +* DONE Wrap this in python + CLOSED: [2019-10-30 Wed 16:59] +* TODO Construct a function in c that uses a function pointer to combine two numbers +* TODO wrap this in python + + + + + + + +* TODO Construct a simple program that recieves a function pointer AND a value, and passes that value to that function pointer diff --git a/python-c-api_solution/todo.org~ b/python-c-api_solution/todo.org~ new file mode 100644 index 0000000..86fcc94 --- /dev/null +++ b/python-c-api_solution/todo.org~ @@ -0,0 +1,2 @@ +* TODO construct simple program in c that prints a value +* TODO Interface this function with python -- GitLab