使用ctypes将python对象作为参数传递给C / C ++函数

时间:2012-06-26 17:47:24

标签: python ctypes python-c-api

我有一个带有PyObject作为参数的函数的dll

之类的东西
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;
}

我希望使用ctypes

在python中调用dll中的这个函数

我的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:exception:访问冲突读取0x00000020

任何改进python代码的建议都会受到关注。

1 个答案:

答案 0 :(得分:2)

我对您的代码进行了以下更改,它对我有用,但我不确定这是100%正确的方法:

  1. 使用PYFUNCTYPE。
  2. 只需传递python类对象。
  3. 例如:

    prototype = c.PYFUNCTYPE(    
        c.c_char_p,                
        c.py_object
    )
    
    func = prototype(('MyFunction', libTest))
    
    func( MyClass )