Python 문법 기초
목차
📌 파이썬에서 C/C++ 로 만들어진 외부 모듈을 참고 하는 경우가 발생한다.
확장 모듈이 필요한 이유
헤더 파일 python.h
spam 이라는 확장 모듈을 만들면서 파이썬과 C의 연동을 실시한다.
>>> import spam
>>> strcnt = spam.strlen("test");
>>> strcnt
4
Spammodule.c 파일 생성하기
첫 줄에 "python.h"를 포함 시킨다.
#include <python.h>
🔔 예) 파이썬에서 spam.stlen을 호출 했을 때 실행되는 C코드 만들기
PyObject
는 파이썬 데이터 타입을 C로 표현할 수 있는 구조체이다.PyArg_ParseTuple()
는 파이썬에서 전달된 인수를 C의 자료형으로 변환해 준다.Py_BuildValue()
는 파이썬에서 인식할 수 있는 오브젝트로 변환한다.
📌 모듈을 임포트 할 때 파이썬 내부에서 다음과 같은 작업이 이루어진다.
확장 모듈을 만들면 2, 3 단계를 직접 해줘야 한다.
📌 모듈을 초기화하려면 Py_InitModule()
혹은 PyModule_Create()
함수를 사용
📌 작성한 코드들을 spammodule.c 파일에 저장.
Distutils 를 이용해서 빌드
C:\> py setup.py install
📌 생성된 spam.pyd를 모듈 검색이 가능한 경로에 복사
확장 모듈 테스트
>>> import spam
>>> spam.strlen("hello world")
11
📌 파이썬에서 C연동을 위한 함수들을 C/API라고 부른다.
PyArg_ParseTuple()
함수Py_BuildValue()
함수
📌 파이썬에서 C로 전달되는 인수를 C함수에 맞게 변경
함수 원형 (Prototype)
int PyArg_ParseTuple(PyObject *arg, char *format, ...);
여러가지 포멧 기호
파이썬 객체 타입 | 기호 | C 자료형 |
int | i | int |
unicode object | s | const char * |
float | f | float |
int | l | long |
bytes object | y | const char * |
unicode object | u | Py_UNICODE |
object | O, S | PyObject |
📌 Py_BuildValue()
는 C의 자료형을 파이썬의 자료형으로 변환
함수 원형 (Prototype)
PyObject *Py_BuildValue(char *format, ...);
🔔 예제)
📌 파이썬 내부에서 발생한 에러는 파이썬에서 처리해준다.
📌 에러가 발생했을 때 어떤 에러가 발생했는지 정하고 NULL을 리턴한다.
PyErr_SetString()
함수
함수 원형
void PyErr_SetString(PyObject *type, const char *message);
type은 에러의 종류를 입력
PyExc_ZeroDivisionError
message
는 에러에 대한 설명
📌 C를 이용해 만든 파이썬 타입
PyObject_HEAD
PyTypeObject
📌 파이썬에서 외부 라이브러리를 간편하게 사용할 수 있는 내장 모듈
🔔 예) ctypes 모듈을 이용해 윈도우 System function 호출 하는 예제
📌 ctypes 가 지원하는 C언어 데이터 타입
ctypes 타입 | C 타입 | 파이썬 타입 |
c_short | Short | int |
c_ushort | unsigned short | int |
c_int | int | int |
c_uint | unsigned int | int |
c_long | Long | int |
🔔 예) ctypes 데이터 타입을 이용한 예제
[python] XML/Socket/배포 (0) | 2017.07.12 |
---|---|
[python] str 클래스/re 모듈/시간 표현/수학 모듈/데이터베이스 (0) | 2017.07.12 |
[python] 모듈/예외 처리/파일 입출력 (0) | 2017.07.12 |
[Python] 단축 평가/while/for/break/continue/else/class (0) | 2017.07.12 |
[Python] list/Set/tuple/딕셔너리(Dictionary)/함수 사용법 (0) | 2017.07.12 |