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모듈을 이용하기"
'ProgrammingLang > python' 카테고리의 다른 글
[python] 3. 문자열 다루기 (0) | 2018.11.06 |
---|---|
[python] 2. 변수와 숫자 타입 (0) | 2018.11.06 |
[python] 1. 파이썬 개요 및 설치 (0) | 2018.11.05 |
Atom에서 Python 실행시 발생하는 문제 해결 (0) | 2017.08.11 |
python 여러디렉토리에 모듈 나누기 (0) | 2017.08.10 |