غدال:الحصول على مؤشر / مقبض الكائن ج الأساسي
سؤال
لدي الإعداد التالي:
- مكتبة غدال مع بيثون الارتباطات (سويغ)
- بعض كود الغراء (بيثون)
- مكتبة سي ، متصلة مع كتيبس
أريد أن تمرير مؤشر مجموعة البيانات الأساسية / مقبض من سويغ 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);
}
لا تنتمي إلى StackOverflow