2

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 関数に渡すと、コードが正常に機能することに注意してください。しかし、リストでは機能しません。アイデアはありますか、なぜ機能しないのですか?

4

1 に答える 1

2

Py_BuildValue の使い方が間違っていました。http://docs.python.org/release/1.5.2p2/ext/buildValue.htmlなどの Web 上のこのメソッドのドキュメントには、このタイプミスがあります。これが、大文字の O の代わりに小さな o を使用した理由です。正しい呼び出しは次のとおりです。 : Py_BuildValue('(O)', l)

于 2014-01-13T21:41:17.113 に答える