문제

다음은 다음과 같습니다.

  • 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); 
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top