본문 바로가기

진리는어디에/Python

[Python] 변수 #4 ctypes 모듈 활용

이번 포스트는 ctype 모듈을 활용하는 방법에 대해 살펴 본다. C에 대한 기본 지식이 있어야 이해가 가능하므로 C 프로그래밍 언어에 대한 사전 지식이 없다면 건너 뛰어도 된다.

목차

  1. 파이썬 변수의 소개
  2. 변수의 타입
  3. 변수의 다양한 정보 확인
  4. >> ctype 모듈을 활용한 변수의 정보 확인
  5. == 와 is 연산자
  6. mutable 변수와 immutable 변수
  7. 변수의 삭제
  8. 파이썬 정수는 Overflow가 없다?

ctypes.Structure

ctypes는 파이썬용 외부함수(foregin function) 라이브러리다. C 호환 데이터형을 제공하며 DLL 또는 공유라이브러리에 있는 함수를 호출 할 수 있다. 그중 ctypes.Structure 모듈은 파이썬에서 C에 정의된 구조체를 파이썬 코드로 접근하기 위해 사용된다.

이번 포스트에서는 변수을 값을 저장하고 있는 객체에 파이썬 코드를 이용하여 직접 접근해보도록 하겠다. 이전 [Python] 파이썬 기초부터 시작하기 - 변수 포스트에서 파이썬 변수의 값을 가지고 있는 PyObject는 대략 아래와 같은 모습을 가지고 있다고 했다. 

위 포멧을 C 코드 형태로 나타내 보면 아래와 같다.

struct PyLongObject
{
    long ob_refcnt;
    void* ob_type;
    unsigned long ob_size;
    long ob_digit;
};

이제 저 구조체의 데이터를 참조 할 수 있는 파이썬 코드를 작성해보자.

import sys
import ctypes

class Int(ctypes.Structure) :
    _fields_ = [('ob_refcnt', ctypes.c_long),
                ('ob_type',   ctypes.c_void_p),
                ('ob_size',   ctypes.c_ulong),
                ('ob_digit',  ctypes.c_long)]

n1 = 10

p1 = Int.from_address(id(n1))

print('sys.getrefcount=' + str(sys.getrefcount(n1)))
print('p1.ob_refcnt=' + str(p1.ob_refcnt))
print('sys.getsizeof=' + str(sys.getsizeof(n1)))
print('p1.ob_size=' + str(p1.ob_size))
  • 4라인 : ctypes.Structure 클래스를 상속 받속 받는 클래스를 선언 한다. Stucture 클래스에는 파이썬에서 C 코드로 정의된 구조체에 접근 하여 값을 가져 오는 방법이 내부적으로 구현되어 있다.
  • 5라인 : _filed_ 는 필드이름과 타입을 저장하는 튜퓰 타입 변수다. c_int와 같은 ctypes형 똔느 파생된 ctypes형(구조체, 공용체, 배열, 포인터)만 저장 가능하다.
  • 12라인 : from_address 함수를 이용하여 n1가 가리키고 있는 객체를 얻어옴

위 예제를 실행하면 아래의 결과를 얻을 수 있다.

> python main.py
sys.getrefcount=15
p1.ob_refcnt=14
sys.getsizeof=28
p1.ob_size=1

눈여겨 살펴 보아야 할 부분이 두 가지가 있다.

첫번째는 getrefcount에러 리턴한 참조 계수와 ob_refcnt를 통해서 얻어온 참조 계수가 다르다. ob_refcnt는 객체 있는 값에 바로 접근하고 getrefcount 호출 시 인자로 넘겨지는 과정에서 내부적으로 참조 계수를 하나 증가 시키기 때문에 getrefcount() 함수를 통해 참조 계수를 얻어 오면 항상 ob_refcnt에 있는 값보다 1 큰 값을 얻게 된다.

두번째는 지금까지는 ob_size를 얻어 올 수 있는 표준 함수라던지 기타 다른 방법이 없었지만 ctypes.Structure를 이용하여 ob_size의 값을 얻어 올 수 있다는 것이다.

마치며

이상 ctypes 모듈의 Structure를 사용하는 방법에 대해 알아 보았다. C에 대한 경험이 있는 분들이라면 쉽게 이해 했으리라 믿는다. 설령 지금 당장 이해하지 못했다고 하더라도 걱정하지 말라. 파이썬 프로그래밍을 하면서 그렇게 자주 쓰이는 기능은 아니므로 큰 불편을 느끼지는 않을 것이다. 일단 이런것이 있다는 정도만 알아두고 훗날 파이썬에서 C 모듈의 함수나 구조체에 접근하여 값을 가져오거나 업데이트 할 일이 생겼을 때 다시 이 포스트를 보면 된다.

다음 포스트에서는 mutable 변수와 immutable 변수에 대해 알아 보도록 하겠다.

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!