【问题标题】:python embedding: passing list from C to python functionpython嵌入:将列表从C传递给python函数
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 实际上,Py_BuildValue('(O)', l) 是错误的。 Py_BuildValue("(O)", l); 是正确的,因为 c++ 需要对字符串使用双引号。
猜你喜欢
  • 2019-08-30
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多