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

python embedding: passing list from C to python function

本文关键字:python 函数 嵌入 列表      更新时间:2023-10-16

尝试从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);

MySolver.py 的 python 脚本是:

def mysolve(vals):
    print vals
    return 0

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

Py_BuildValue的用法是错误的。例如 http://docs.python.org/release/1.5.2p2/ext/buildValue.html 网络上的此方法的文档有这个错别字,这就是为什么我使用小 o 而不是大写的 O 的原因。正确的调用是:Py_BuildValue("(O)", l)