12. 11
C-Extension은 일반적인 파이썬 인터프리터 구현체인
CPython에서 동작
인터프리터로 해석되는 방식이 아닌 Machine Code가 삽입
되어 동작하므로 성능도 좋은 편
Python C API가 제공되므로 생각 외로 구현이 쉬움
반대로 C프로그램에서 Python Interpretor를 내장할 수
도 있음
C Extension의 장점
16. 15
http://qwefgh90.github.io
확장 개발 방법을 한글로 발번역 해놨습니다.
장담 못함….
참조할 만한 동영상 (Visual Studio 기준)
http://www.youtube.com/watch?v=y_eh00oE5rI
어떻게 확장 프로그램을 짤까?
17. 16
구현 절차는 다음과 같다. (Visual Studio 기준)
1) C 확장 모듈의 이름을 결정한다. (changext 로 가정한다.)
2) 결정한 모듈 이름으로 win32 - DLL 개발 프로젝트를 생성한다.
3) C:Python27include 폴더를 include 하고 C:Python27libs를 라이브러리 경
로로 지정한다.
4) “PyMODINIT init모듈이름 ()” 함수를 정의한다.
5) Python API를 사용하여 함수를 작성한 후 PyMethodDef 배열을 통해 함수목록을
생성한다.
6) Py_InitModule 함수를 통해 테이블을 등록하고 모듈을 초기화 한다.
7) VS2010에서 컴파일한 후 결과물인 changext.dll 파일을 changext.pyd로 바꾼다.
어떻게 확장 프로그램을 짤까?
18. 17
링크를 따라가서 살펴봅시다. (초기화 소스)
https://github.com/qwefgh90/AlgorithmSolution/bl
ob/master/PythonExtension2010/PythonExtensi
on2010/main.cpp
링크를 따라가서 살펴봅시다. (구현 소스)
https://github.com/qwefgh90/AlgorithmSolution/bl
ob/master/PythonExtension2010/PythonExtensi
on2010/py_algorithm.cpp
어떻게 확장 프로그램을 짤까?
19. 18
결론은 Python.h 에 정의된 함수를 사용해서 손쉽게 코딩
을 할 수 있습니다.
어떻게 확장 프로그램을 짤까?
20. 2) 파이썬 타입을 정의
하는 구조체에
malloc 같은거 써서
19
python.exe
CPython 인터프리터
1) 스크립트를 해석한 후
2) 동적 할당을 이용한
동적으로
파이썬 변수 생성
hellworld.py
4) 파이썬 API를 이용해
파이썬의 모든 자원을
손쉽게 생성 및 접근
changExt.dll(pyd) 로드
Python C Extension
3) 파이썬 API를 이용해
확장 프로그램 호출
24. 23
간단한 절차
1) 라이브러리의 기능을 바탕으로 인터페이스를 구성한다. (예: 계산기 덧셈, 뺄샘)
2) C 변수로 관리할 자료구조를 생각해본다.
3) C 확장과 파이썬이 어떤 데이터를 주고 받을지 생각한다.
4) 위 내용을 바탕으로 인터페이스를 구현한다.
팁
- Python 변수에서 C자료 구조를 사용할 땐 Capsule이라는 클래스에 포인터를 삽입
해서 사용한다.
- Python 변수는 참조되지 않으면 쉽게 사라지므로 Capsule이 사라질 때 소멸자로 자
원 해제를 한다.
Red Black Tree 포팅
25. 24
RBTree 기능 (헤더)
https://github.com/qwefgh90/AlgorithmSolution/b
lob/master/PythonExtension2010/PythonExtension
2010/rbtree.h
RBTree를 위한 C확장
https://github.com/qwefgh90/AlgorithmSolution/b
lob/master/PythonExtension2010/PythonExtension
2010/py_rbtree.h
Red Black Tree 포팅
#7: class ClassA(object):
email = ''
name = ''
strong = ClassA()
strong.email = 'kelp[at]phate.org'
strong.name = 'Kelp'
모듈, 클래스, 객체와 같은 언어의 요소가 내부에서 접근
for name in dir(strong):
attr = getattr(strong.__class__, name)
if not callable(attr) and name.find('__') != 0:
print('%s = %s' % (name, getattr(strong, name)))