سؤال

لدي الإعداد التالي:

  • مكتبة غدال مع بيثون الارتباطات (سويغ)
  • بعض كود الغراء (بيثون)
  • مكتبة سي ، متصلة مع كتيبس

أريد أن تمرير مؤشر مجموعة البيانات الأساسية / مقبض من سويغ Dataset الاعتراض على مكتبتي ج.كيف يمكنني استرداد هذا المؤشر?

أفعل لا تريد واجهة مكتبة ج مع سويغ.

هل كانت مفيدة؟

المحلول

كان في الواقع من السهل جدا ، وآمل أن بلدي الحل هو المحمولة.معطى, أن تعريف دالة ج الخاص بي يبدو إلى حد ما مثل هذا:

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)

ويمكنني استدعاء وظيفة ج مع:

ds = gdal.Open(path)
...
_myfunc(C.c_void_p(long(ds.this)))

نصائح أخرى

حجزي مع نهج كتيبس لهذه المشكلة هو أن العد المرجعي للكائن دس لا يزداد تلقائيا وسوف تصبح مؤشر سيئة إذا كان للخروج من النطاق.

سيكون النهج الأفضل هو تحديد وحدة تمديد بيثون التي من شأنها إدارة عداد مرجع البيانات.

أنا باستخدام بيوبجيكت ثابت * لعقد الكائن ، من الواضح أن التنفيذ الحقيقي تخزينه أكثر ذكاء.

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