C ++为numpy并返回C ++,元组PyObject

时间:2015-04-22 17:16:52

标签: python c++ numpy pyobject

我正在实现一个Visual C ++代码(MS VStudio 2013),它从相机中获取图像,处理图像,通过PyObject将预处理数据(一个数组2个或更多个数组)发送到python,并获得numpy-处理后的结果来自python(py中的3个双元组,在C ++中变为3个双精度数组)。我测试了py函数作为独立脚本。但是,我继续从PyObject_CallObject()返回null。 python和VC ++项目位于同一目录中。

我在py函数中设置了一个日志文件记录来记录来自C的调用,所以我知道在某些情况下C ++调用没有到达py函数,而在其他情况下py函数会被调用,但是,也许无法处理返回的值。具体来说,我发现当元组包含一个对象时我可以调用py函数(正日志记录),但是当元组包含两个或更多对象时,我无法调用它(没有日志文件记录)。另外,如果py函数不需要参数,并且不需要返回任何内容,则所有调用都成功。

我用Google搜索并阅读了与使用元组在C ++和py之间进行通信的所有内容,但仍然无法使其正常工作。我还阅读了文档和示例,但仍然没有运气。

我已经将代码剥离到最低限度并重现了问题。下面是一个例子,当我传递两个零作为输入,并期望得到三个零。我会非常感谢任何领导......

//C++ part
    Py_Initialize();    
    pyName = PyImport_ImportModuleNoBlock(_T("find_center_def"));
    if (pyName == NULL) {       
        return false;
    }
    pyFunc = PyObject_GetAttrString(pyName, _T("find_center"));
    if (pyFunc == NULL) {
        return false;
    }
    Py_DECREF(pyName);
    if (PyCallable_Check(pyFunc) == 0) {
        return false;
    }
    PyObject * arg = PyTuple_New(2);
    PyObject * datum0 = PyFloat_FromDouble(0.0);
    PyObject * datum1 = PyFloat_FromDouble(0.0);
    if (PyTuple_SetItem(arg, 0, datum0) != 0) {
        return false;
        }
    if (PyTuple_SetItem(arg, 1, datum1) != 0) {         
        return false;
        }
    PyObject * result = PyObject_CallObject(pyFunc, arg);
    if (result == NULL) {
        return false;
    }
    OutputDebugString(_T("\nSuccess calling find_center function!"));

#python part, inside of a script called find_center_def.py
def find_center(args):
    import numpy        
    fo=open('foo.txt' ,'w')
    fo.write('find_center was called from C++!')
    fo.close()
    return (0,0,0)

#python output:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
>>> import importlib
>>> test = importlib.import_module("find_center_def")
>>> test.find_center((0,0))
(0, 0, 0)
>>>

1 个答案:

答案 0 :(得分:1)

您只能为元组添加单个值,因为

  

PyObject * PyObject_CallObject(PyObject * callable_object,PyObject   *参数)       使用元组args给出的参数调用可调用的Python对象callable_object,

(强调我的)。换句话说,PyObject_CallObject的第二个参数是参数的元组。您的函数只接受一个参数,因此该元组的长度必须为1.

由于您尝试将元组作为一个参数传递,因此您需要将两元素元组作为单元素元组的第一个元素,并将其作为第二个参数传递给PyObject_CallObject。< / p>

另一种选择是使用PyObject_CallFunction代替,并让它构建参数元组。