Language/Python [Python] 파이썬 C/C++ 외부 모듈 참조
  • 728x90
    반응형

     

     

     

      Python 문법 기초


     

     

    목차

       

       

      📌 파이썬에서 C/C++ 로 만들어진 외부 모듈을 참고 하는 경우가 발생한다.

       

      확장 모듈이 필요한 이유

      • C/C++ 라이브러기 함수 혹은 시스템 콜을 할 수 있는 새로운 객체 타입을 구현할 수 있다.
      • C의 빠른 연산을 사용할 수 있음
      • 핵심적인 부분을 공개하지 않고 배포할 수 있다.

       

      헤더 파일 python.h

      spam 이라는 확장 모듈을 만들면서 파이썬과 C의 연동을 실시한다.

      • 입력 받은 문자열을 구하는 함수를 포함
      • 파이썬에서 spam 모듈이 아래와 같이 사용 될 것임

      >>> import spam

      >>> strcnt = spam.strlen("test");

      >>> strcnt

      4

       

      Spammodule.c 파일 생성하기

      • 전통적으로 '모듈이름' + module.c 와 같은 형식으로 파일이름 지정

       

      첫 줄에 "python.h"를 포함 시킨다.

      #include <python.h>

       

      • 헤더파일을 포함할 때 python.h를 제일 먼저 포함해야 한다.

       

      🔔 예) 파이썬에서 spam.stlen을 호출 했을 때 실행되는 C코드 만들기

       

      • PyObject 는 파이썬 데이터 타입을 C로 표현할 수 있는 구조체이다.
      • PyArg_ParseTuple() 는 파이썬에서 전달된 인수를 C의 자료형으로 변환해 준다.
      • Py_BuildValue() 는 파이썬에서 인식할 수 있는 오브젝트로 변환한다.

       

       

      모듈 초기화

      📌 모듈을 임포트 할 때 파이썬 내부에서 다음과 같은 작업이 이루어진다.

      • 1단계: 모듈을 찾는다 .
      • 2단계: 모듈을 초기화 한다.
      • 3단계: 지역 이름공간(Local Namespace)에 이름을 정의한다.

      확장 모듈을 만들면 2, 3 단계를 직접 해줘야 한다.

       

       

      Py_initModule() 함수

      📌 모듈을 초기화하려면 Py_InitModule()혹은 PyModule_Create() 함수를 사용

       

       

       

      확장 모듈 빌드

      📌 작성한 코드들을 spammodule.c 파일에 저장.

       

      Distutils 를 이용해서 빌드

      C:\> py setup.py install

       

       

       

      확장 모듈 spam 테스트

      📌 생성된 spam.pyd를 모듈 검색이 가능한 경로에 복사

       

      확장 모듈 테스트

      >>> import spam

      >>> spam.strlen("hello world")

      11

       

       

      파이썬 C/API

      📌 파이썬에서 C연동을 위한 함수들을 C/API라고 부른다.

      • PyArg_ParseTuple() 함수
      • Py_BuildValue() 함수

       

       

      PyArg_ParseTuple()

      📌 파이썬에서 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() 함수

      📌 Py_BuildValue()는 C의 자료형을 파이썬의 자료형으로 변환

       

      함수 원형 (Prototype)

      PyObject *Py_BuildValue(char *format, ...);

       

      🔔 예제)

       

       

       

      예외 처리

      📌 파이썬 내부에서 발생한 에러는 파이썬에서 처리해준다.

      • C 확장 모듈에서 발생한 에러는 특별한 작업을 해줘야 한다.
      • 에러가 발생했을 때 에러의 상황을 파이썬에 직접 알려 줘야 한다.
      • 파이썬 C/API함수들은 틀별히 예외 처리를 하지 않아도 된다.

       

       

       

       

      에러가 발생하였을 때

      📌 에러가 발생했을 때 어떤 에러가 발생했는지 정하고 NULL을 리턴한다.

       

      PyErr_SetString() 함수

      • 에러를 설정하는 가장 대표적인 함수.

      함수 원형

      void PyErr_SetString(PyObject *type, const char *message);

       

      type은 에러의 종류를 입력

      • 분수의 제수가 0일 때 PyExc_ZeroDivisionError
      • message는 에러에 대한 설명

       

      확장 타입

      📌 C를 이용해 만든 파이썬 타입

      • 파이썬이 제공하는 패턴을 이용해 타입을 만들면 비교적 쉽게 확장 타입을 만들 수 있다.

       

      PyObject_HEAD

      • 확장 타입 인스턴스의 참조 카운터, 타입 객체의 포인터를 선언하는 매크로

       

      PyTypeObject

      • 파이썬 include 디렉터리의 object.h에 선언
      • 확장 타입 생성에 필요한 목록이 선언되어 있는 구조체
      • 모든 항목을 다 채울 필요는 없고 사용하는 기능만 사용하면 된다.

       

       

      ctypes

      📌 파이썬에서 외부 라이브러리를 간편하게 사용할 수 있는 내장 모듈

      • C의 데이터 타입이나, DLL혹은 shared library의 함수들을 직접 사용할 수 있다.

       

      🔔 예) ctypes 모듈을 이용해 윈도우 System function 호출 하는 예제

       

       

       

      ctypes로 C데이터 타입 사용하기

      📌 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 데이터 타입을 이용한 예제

       

       

       

       

       

       

      728x90
      반응형
    상단으로