【发布时间】:2014-01-09 21:45:34
【问题描述】:
尝试将列表从 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 函数调用时报告任何错误。 请注意,如果我将单个参数作为元组传递给我的求解函数,则代码可以正常工作。但是有一个列表它不起作用。任何想法,为什么它不起作用?
【问题讨论】:
-
您的实际代码中有错误检查代码吗?
-
我在 PyObject_CallObject 之后添加了 PyErr_PrintEx(),它说 TypeError: argument list 必须是一个元组。参数不能是列表吗?
-
一个参数可以是一个列表。
arglist必须是一个元组,其中包含一个列表作为您案例中唯一的项目。在 C 中每次调用都检查错误。特别是检查Py_BuildValue()返回值。 -
确实 Py_BuildValue() 给出了这个错误 - SystemError: bad format char passed to Py_BuildValue。知道有什么问题吗?
标签: python c++ c list python-embedding