ProgrammingLang/python

Python에서 C를 그대로 사용하기

jinkwon.kim 2017. 8. 17. 16:28
728x90
반응형


Python에서 C를 그대로 사용하기


0. python에서 import되면 일어나는 현상 

 - python에서는 특정 모듈을 사용하기위 import문을 이용하여 모듈을 지정한다. 

 - Python에서 사용하고 로드하는 모듈은 아래의 순서로 찾고 그와 일치하면 모듈을 초기화한 후에 지역 이름공간에 이름을 정의한다.

   ex) import mylib 

   1) sys.modules 에 등록되어 있는지 확인한다. 등록되어 있으면 로드한다.

   2) 1)에서 존재하지 않으면 sys.path의 디렉토리를 검색하면서 모듈을 찾는다.

   3) 모듈을 초기화 한다.

   4) 모듈이름을 지역이름공간에 할당한다.

   

1. Python C모듈 사용하는 방법

 - Python은 C로만들어져 있다, 그러므로 C모듈을 가져다 쓸수있다.

2. Pyhon의에서 C모듈 사용하기위한 방법

 1) 필요 파일

  - 모듈화 하기 위한 c파일

  - c모듈을 사용하기위한 python 파일 

  - c모듈을 컴파일하고 설치하기위한 setup.py파일 

 2) c파일 작성

파이썬에서 사용하는 C모듈은 리눅스에서는 .so 확장자 형태로, 윈도에서는 .pyd 확장자 형태로 빌드되어 파이썬 패키지 디렉토리의 Lib/site-package 디렉로리로 복사되므로서 사용가능하게 된다.

    1) C로 소스코드를 작성한다.

    2) 작성한 C 소스코드를 컴파일하여 파이썬이 이용가능한 .so (리눅스에서) 및 .pyd(윈도용) 파일로 빌드한다.

    3) .so 및 .pyd 파일을 파이썬 디렉토리의 Lib/site-package로 복사한다.


그러면 하나의 실제 C모듈을 만들어 적용하므로서 설명해보자.

파이썬이 C 모듈을 import 하게되면 초기화를 위해 "init+모듈이름" 으로 된 함수를 호출한다. 모듈이름이 mylib 이면 initmylib()을 호출한다는 말이다.

그러므로 우리의 C 소스에는 위에서 설명한 초기화를 위한 함수 init+모듈이름 으로 된 함수가 존재해야만 한다.

예제로 만들 모듈은 입력한 문자열을 pylog.txt 라는 파일에 기록하는 모듈이다. 주석을 달았으므로 주석을 참조하도록 한다.

// mylib.c


#include "Python.h"

#include <stdio.h>


static PyObject *ErrorObject;


// 실제 동작하는 함수

static PyObject* write_log(PyObject *self, PyObject *args) // 인자는 이와같이 고정된다.

{

char* msg;

FILE *fp;

if(!PyArg_ParseTuple(args, "s", &msg))

return NULL;

fp = fopen("c:\\pylog.txt", "wt+");

fprintf(fp, msg);


fclose(fp);

return Py_BuildValue("i", 0);    

}


 


/* methods 구조체 배열에 지정되는 정보는 {"실제사용할 메쏘드명", 메쏘드명에 대응하는 실제 동작하는 함수명, 인자 종류} */

static struct PyMethodDef methods[] =

{

{"wlog", write_log, METH_VARARGS},

{NULL, NULL}

};



//

void initmylib()

{

PyObject* m;



  // Py_InitModule("모듈명", 이모듈에 적용된 메쏘드들을 담을 구조체배열 포인터)

m = Py_InitModule("mylib", methods);



ErrorObject = Py_BuildValue("s", "error");

}


위의 C 코드를 컴파일하기 위해 setup.py 함수를 작성해야 한다.

  3) Pthon파일 작성 

# test.py


import mylib


 


if __name__ == '__main__':    

mylib.wlog('I love U')


  4) setup파일 작성

    # setup.py

from distutils.core import setup, Extension

setup(name = "mylib",

        version = "1.0",

        description = "print log",

        author = "Samsjang",

        author_email = "samsjang@cdnetworks.co.kr",

        url = "http://www.cdnetworks.co.kr",

        ext_modules = [Extension("mylib", ["mylib.c"])] 

        )

위의 소스에서 ext_modules에는 적용할 모듈명과 그 모듈의 구현코드를 기록한다. 나머지 부분의 기타 정보를 기록해둔 메타정보에 불과하다.

위의 명령은 리눅스에서는 gcc를 호출하며, 윈도에서는 visual C++ 컴파일러가 구동되면서 빌드한 후 파이썬 디렉토리의 Lib/site-packages 디렉토리에 mylib.so 또는 mylib.pyd  파일이 생성된다.


4)빌드 및 실행

python setup.py install

python test.py


위의 결과는 C:\\pylog.txt 파일에 "I love U" 라는 글을 남긴다.

출처:"파이썬에서 C모듈을 이용하기"


728x90
반응형