2012-06-26 131 views
0

我对此采取的PyObject作为参数 像传递Python对象作为参数传递给C/C++使用功能的ctypes

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,我想通过调用从蟒蛇的dll这一功能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代码 一些问题,当我运行这款C颂我得到的消息像

WindowsError:异常:访问冲突阅读0x00000020

任何建议,以提高Python代码将appriciated。

+0

我想'PyObject_GetAttrString(班 “的getAddress”)'真的'PyObject_GetAttrString(OBJ “的getAddress”)'?我还假设你检查每个函数结果,并且它们都不是null,直到'cout <<'? – 9000

+0

是它是一个错字。谢谢。我会解决它。除此之外,C代码还是不错的。我在Python部分遇到问题。将指针指向从Python到Python函数的Python对象。怎么样 ? – Maverick

+0

嗯,我不知道真实的,但我_think_'byref'在这里不需要。我想'func(pyobj)'应该可以工作。通过'byref',C代码得到一个指向指针的指针。 – 9000

回答

1

我做了以下修改到您的代码和它的工作对我来说,但我不知道它是做100%正确的方法:

  1. 使用PYFUNCTYPE。
  2. 只需传递python类对象。

例如:

prototype = c.PYFUNCTYPE( 
    c.c_char_p,     
    c.py_object 
) 

func = prototype(('MyFunction', libTest)) 

func(MyClass) 
+0

是的,它也适用于我,谢谢。 但是,请你能解释一下c.PYFUNCTYPE和c.CFUNCTYPE的区别。我如何知道选择哪一个? – Maverick

+0

除了不释放GIL(全局解释器锁)外,我在文档中找不到太多内容。由于您的DLL使用Python API并传递python对象,因此它似乎是一个不错的选择。 –

相关问题