ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python예제 - ctypes 기초
    Search: Python Python 2019. 3. 5. 21:05


    2018/12/10 - Python예제 목록



    파이썬용 외부 함수 라이브러리

    ctypes는 파이썬용 외부 함수(foreign function) 라이브러리입니다. C 호환 데이터형을 제공하며, DLL 또는 공유 라이브러리에 있는 함수를 호출할 수 있습니다. 이 라이브러리들을 순수 파이썬으로 감싸는 데 사용할 수 있습니다.

    윈도우는 일반적인 .dll 파일 접미사를 자동으로 추가합니다.

    cdll은 표준 cdecl 호출 규칙

    windll은 stdcall 호출 규칙

    oledll은 stdcall 호출 규칙

    함수가 윈도우 HRESULT 에러 코드를 반환한다고 가정합니다. 에러 코드는 함수 호출이 실패할 때 OSError 예외를 자동으로 발생시키는 데 사용됩니다.


    리눅스에서 라이브러리를 로드

    리눅스에서, 라이브러리를 로드하기 위해서는 확장자를 포함하는 파일명을 지정해야 하므로, 어트리뷰트 액세스를 사용하여 라이브러리를 로드 할 수 없습니다. dll 로더의 LoadLibrary() 메서드를 사용하거나 CDLL의 생성자를 호출하여 인스턴스를 만들어 라이브러리를 로드해야 합니다:

    cdll.LoadLibrary("libc.so.6")  

    <CDLL 'libc.so.6', handle ... at ...>

    libc = CDLL("libc.so.6")       

    libc                           

    <CDLL 'libc.so.6', handle ... at ...>


    DLL내부 이름 형태의 함수

    dll은 "??2@KAPAXI@Z"와 같은 유효한 파이썬 식별자가 아닌 이름으로 함수를 내보냅니다. 이때는 getattr()를 사용하여 함수를 조회해야 합니다.

    getattr(cdll.msvcrt, "??2@KAPAXI@Z")  

    <_FuncPtr object at 0x...>


    서수(ordinal)형태의 함수

    윈도우에서, 일부 dll은 이름이 아니라 서수(ordinal)로 함수를 내보냅니다. 이 함수는 서수로 dll 객체를 인덱싱하여 액세스할 수 있습니다:

    cdll.kernel32[1]  

    <_FuncPtr object at 0x...>

    cdll.kernel32[0]  

    Traceback (most recent call last):

      File "<stdin>", line 1, in <module>

      File "ctypes.py", line 3, in __getitem__

        func = _StdcallFuncPtr(name, self)

    AttributeError: function ordinal 0 not found



    NULL포인터는 python에 None을 사용

    print(libc.time(None))



    C 호환 데이터형


    데이터형 초기화

    c_int() #c_long(0)

    i = c_int(3) #c_long(3)

    print(c_int(3).value) #3

    c_wchar_p("Hello") #c_wchar_p(47910784)

    c_wchar_p("Asdf").value #"Asdf"



    댓글