GDal : 기본 C 객체의 포인터 / 핸들 가져 오기
문제
다음은 다음과 같습니다.
- Python 바인딩이있는 GDal 라이브러리 (Swig)
- 일부 접착제 코드 (Python)
- CTYPES와 인터페이스 된 C 라이브러리
Swig Dataset
객체의 기본 데이터 집합 포인터 / 핸들을 C 라이브러리에 전달하고 싶습니다.이 포인터를 어떻게 검색 할 수 있습니까?
i do 아니오 c 라이브러리를 swig와 인터페이스하고 싶습니다.
해결책
실제로 쉽게 쉽게 쉽게 쉽게 해결책이 휴대가되기를 바랍니다.주어지면 내 C 함수 정의가 다음과 같이 보입니다.
int myfunc(GDALDatasetH ds);
.
다음 내 ctypes
정의는 다음과 같습니다.
_lib = C.LibraryLoader(C.CDLL).LoadLibrary(lib_path)
_myfunc = _lib.myfunc
_myfunc.argtypes = [C.c_void_p]
_myfunc.restype = C.POINTER(C.c_char)
.
와 나는 C 함수를 다음과 같이 부를 수 있습니다 :
ds = gdal.Open(path)
...
_myfunc(C.c_void_p(long(ds.this)))
. 다른 팁
이 문제에 대한 CTYPES 접근 방식으로 예약은 DS 객체의 참조 수가 자동으로 증가하지 않으며 범위를 벗어나는 경우 나쁜 포인터가된다는 것입니다.
더 나은 접근법은 데이터 참조 카운터를 관리 할 C 파이썬 확장 모듈을 정의하는 것입니다.
나는 정적 pyobject *를 사용하여 객체를 잡고 분명히 실제 구현이 더 지능적으로 저장 될 것입니다.
static PyObject * ds;
PyObject* GiveDsToC(PyObject * self, PyObject * args)
{
PyObject * pThis=NULL;
unsigned long addr;
if(!PyArg_ParseTuple(args, "O", &ds))
return NULL;
/* Ensure the interpreter keeps ds around while we have it */
Py_INCREF(ds);
pThis = PyObject_GetAttrString(ds, "this"); // new reference
addr = PyLong_AsLong(pThis); // convert using __int__ method
Py_DECREF(pThis); // Release the object back
CallSomeCFunction(addr);
Py_RETURN_NONE;
}
void FinishedWithDS(void)
{
// Lock the GIL and decrement the reference counter
PyGILState_STATE state = PyGILState_Ensure();
Py_DECREF(ds);
PyGILState_Release(state);
}
. 제휴하지 않습니다 StackOverflow