python ctypes 예제

위의 예에서 Python이 전달한 문자열 버퍼를 할당하여 더 이상 필요하지 않은 경우 해당 메모리를 해제 할 수 있었습니다. 이 예제에서는 ctype 라이브러리를 사용하여 파이썬 내에서 C 코드를 사용합니다. 그러나 C에서 메모리를 할당한 다음 일부 조작을 위해 파이썬에 전달해야 하는 경우가 자주 있습니다. 이 작동 하지만 완료 될 때 그것을 해제할 수 있도록 C에 메모리 포인터를 다시 전달할 수 있도록 몇 가지 추가 단계를 수행 해야 합니다. 우리가 호출하는 C 함수는 숫자를 int 개체로 계산합니다. 다시 말하지만, ctype은 쉽게 일을 할 수 있습니다 – 주위에 ints를 전달하는 것은 원활하게 작동하고 당신이 그것을 기대하는 거의 많은 작업을 수행합니다. 이 자습서의 마지막 예제에 도착 하기 전에 간단한 옆으로 하 고 ctype 매개 변수를 전달 하 고 값을 반환 하는 방법에 대해 이야기 해야 합니다. 위에서 보았듯이 필요한 경우 반환 유형을 지정할 수 있습니다. 이 멤버는 None 또는 메모리 블록 내용이 유효하도록 유지되어야 하는 Python 개체를 포함하는 사전입니다. 이 개체는 디버깅용으로만 노출됩니다.

이 사전의 내용을 수정하지 마십시오. 외래 함수의 결과 형식을 지정하는 ctype 형식을 할당합니다. void에 없음을 사용하며 아무 것도 반환하지 않는 함수입니다. 외래 함수가 정수를 반환하는 경우 호출 가능한 Python 개체(예: 함수 또는 클래스)를 restype 특성으로 사용할 수도 있습니다. 호출 가능은 C 함수가 반환하는 정수와 함께 호출되며 이 호출의 결과는 함수 호출의 결과로 사용됩니다. 오류 반환 값을 확인하고 자동으로 예외를 발생시키는 데 유용합니다: 첫 번째 줄에서 ctype 모듈을 가져온 다음 공유 라이브러리가 로드됩니다(일반적으로 여기에 운영 체제에 대한 검사를 포함하고 대신 dll의 이름을 지정하려는 경우) 창에서 실행되는 경우). 변수 _sum에 저장되며 이 라이브러리의 함수는 멤버(예: _sum.our_functions)로 액세스할 수 있습니다. 다음 줄에서는 함수에 대한 인수 형식을 설정합니다. 함수 ctype입니다. 포인터는 포인터 데이터 형식을 생성하므로 ctype입니다. 포인터(ctypes.c_int)는 int*에 대한 ctype 데이터 형식입니다.

함수를 사용할 때 ctype은 인수가 이러한 형식에 맞는지 확인합니다. ctype은 파이썬의 외래 함수 라이브러리입니다. C 호환 데이터 형식을 제공 하며 DLL 또는 공유 라이브러리에서 호출 함수를 허용 합니다. 순수 파이썬에서 이러한 라이브러리를 래핑하는 데 사용할 수 있습니다. ctype 형식의 튜플을 할당하여 함수가 허용하는 인수 형식을 지정합니다. stdcall 호출 규칙을 사용하는 함수는 이 튜플의 길이와 동일한 수의 인수로만 호출할 수 있습니다. C 호출 규칙을 사용하는 함수는 지정되지 않은 추가 인수를 허용합니다. 예를 들어, free(void *)를 호출하는 확장 모듈에 의해 할당된 메모리를 확보해야 하는 경우 메모리를 할당한 동일한 라이브러리에서 함수를 사용하는 것이 중요합니다. 따라서이 포인터를 조작하면 유용 할 수도 있습니다.

예제 크기를 제한하기 위해 이 테이블을 ctype으로 읽을 수 있는 방법만 보여 드리겠습니다: `foo.dll` 또는 `libfoo.so`라는 라이브러리를 빌드했다고 가정하면 두배 버퍼와 int를 인수로 포인터를 가져와 int를 반환하는 `bar`라는 함수를 포함합니다. , 다음 코드는 당신을 시작하고 실행해야합니다.