반응형

파이썬, C 공유 라이브러리 이용

 

글. 수알치 오상문  

 

[참고] https://www.youtube.com/watch?v=a65JdvOaygM


파이썬에서 C 언어로 만들어진 공유 라이브러리 함수를 이용하는 예입니다.
아래 예제 진행은 Ubuntu에서 테스트 되었습니다.

1. sudo apt-get install gcc   <-- GCC 컴파일러 개발환경 설치!


2. sudo apt-get install python3-dev     
   sudo apt-get install python3.10-dev   <-- 여기서는 버전 지정하여 설치했음
                     파이썬2는 python2-dev

 

--> Python.h 등 설치됨


3. C 언어 피보나치 함수 작성

-------------------------------------------
// myModule.c
#include <Python.h>
 
int Cfib(int n)
{
    if (n < 2)
        return n;
    else
        return Cfib(n-1) + Cfib(n-2);
}
 
static PyObject* fib(PyObject* self, PyObject* args)
{
    int n;
 
    if (!PyArg_ParseTuple(args, "i", &n))  // "i": int
        return NULL;
 
    return Py_BuildValue("i", Cfib(n));
}

static PyObject* version(PyObject* self)
{
    return Py_BuildValue("s", "Version 1.0");  // "s": string
}
 
static PyMethodDef myMethods[] = {
    {"fib", fib, METH_VARARGS, "Calculate the Fibonacci numbers."},
    {"version", (PyCFunction)version, METH_NOARGS, "Returns the version."},
    {NULL, NULL, 0, NULL}
};
 
static struct PyModuleDef myModule = {
PyModuleDef_HEAD_INIT,
"myModule", // name of module.
"Fibonacci Module",
-1,
myMethods
};

PyMODINIT_FUNC PyInit_myModule(void)
{
    return PyModule_Create(&myModule);
}
-------------------------------------------


4. setup.py 작성하고 so(공유라이브러리) 파일로 빌드 

-------------------------------------------
# setup.py
from distutils.core import setup, Extension

module = Extension('myModule', sources = ['myModule.c'])
 
setup (name = 'PackageName',
        version = '1.0',
        description = 'This is a package for myModule',
        ext_modules = [module])
-------------------------------------------

>>> python3 setup.py build     <-- GCC 빌드 

성공하면 ./build/lib.linux-x86_64... 디렉터리에 *.so 파일이 생성됨.

myModule.cpython-310-x86_64-linux-gnu.so 파일을  
test.py 위치로 복사한다.


5. 파이썬 테스트 파일(test.py) 작성 및 실행

-------------------------------------------
import myModule

print(myModule.fib(10))
print(myModule.version())
-------------------------------------------

>>> python3 test.py 

55                <-- 성공!!!
Version 1.0     

반응형

+ Recent posts