python嵌入:将列表从C传递给python函数

时间:2014-01-09 21:45:34

标签: python c++ c list python-embedding

尝试从C ++传递列表到python是行不通的。以下是相关代码(使用其他相关帖子编写):

Py_Initialize();
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));

// Build the name object
pName = PyString_FromString("MySolver");

// Load the module object
pModule = PyImport_Import(pName);

// pDict is a borrowed reference 
pDict = PyModule_GetDict(pModule);

// pFunc is also a borrowed reference 
pFunc = PyObject_GetAttrString(pModule, "mysolve");

if (!PyCallable_Check(pFunc))
  PyErr_Print();

PyObject *l = PyList_New(xvarcount);
for(size_t i=0; i<xvarcount; i++){
  pValue = PyInt_FromLong(0);
  PyList_SetItem(l, i, pValue);
}

PyObject *arglist = Py_BuildValue("(o)", l);
pValue = PyObject_CallObject(pFunc, arglist);

python脚本MySolver.py是:

def mysolve(vals):
    print vals
    return 0

我正在做其他地方建议的一切。 mysolve函数只是没有被调用,C ++程序只是前进而没有在PyObject_CallObject函数调用中报告任何错误。 请注意,如果我将单个参数作为元组传递给my solve函数,则代码可以正常工作。但是有一个列表它没有用。任何想法,为什么它不起作用?

1 个答案:

答案 0 :(得分:1)

Py_BuildValue的使用是错误的。在网上记录这种方法,例如http://docs.python.org/release/1.5.2p2/ext/buildValue.html有这个错字,这就是我使用小o而不是大写O的原因。正确的调用是: Py_BuildValue('(O)',l)