У меня есть dll с функцией, которая принимает PyObject в качестве аргумента, что-то вроде
void MyFunction(PyObject* obj)
{
PyObject *func, *res, *test;
//function getAddress of python object
func = PyObject_GetAttrString(obj, "getAddress");
res = PyObject_CallFunction(func, NULL);
cout << "Address: " << PyString_AsString( PyObject_Str(res) ) << endl;
}
и я хочу вызвать эту функцию в dll из python, используя ctypes
Мой код Python выглядит так
import ctypes as c
path = "h:\libTest"
libTest = c.cdll.LoadLibrary( path )
class MyClass:
@classmethod
def getAddress(cls):
return "Some Address"
prototype = c.CFUNCTYPE(
c.c_char_p,
c.py_object
)
func = prototype(('MyFunction', libTest))
pyobj = c.py_object(MyClass)
func( c.byref(pyobj) )
есть некоторая проблема в моем коде Python, когда я запускаю этот код, я получаю сообщение вроде
WindowsError: исключение: чтение нарушения прав доступа 0x00000020
Любое предложение по улучшению кода Python будет оценено.
PyObject_GetAttrString(Class, "getAddress")
на самом делеPyObject_GetAttrString(obj, "getAddress")
? Я также предполагаю, что вы проверяете каждый результат функции, и ни один из них не является нулевым доcout <<
? - person 9000   schedule 27.06.2012byref
здесь не нужен. Я полагаю, что простоfunc(pyobj)
должно работать. С помощьюbyref
код C получает указатель на указатель. - person 9000   schedule 27.06.2012