9

C アプリケーションに Python (2.7) ライブラリを埋め込もうとしていて、Python/C API を使用して C から Python コードを呼び出しています。キーワード引数を取る Python メソッドを呼び出す必要があります。意味的には、Python で次の行に相当するものを実現しようとしています。

myobject.dosomething('blahdy blah', somearg=True)

ドキュメントを読むことで、私は次のようになりましたが、これはキーワード引数を渡しません:

PyObject_CallMethod(myobject, "dosomething", "s", "blahdy blah");

私は Python にあまり詳しくありません。ドキュメントがこれについて完全に明確ではなく、Google 検索でもあまり有用な情報が得られなかったため、この時点でちょっと行き詰まっています。助けていただければ幸いです。

4

2 に答える 2

8

タマスの答えは仕事を終わらせますが、メモリリークもします。漏れを防ぐために、

PyObject *args = Py_BuildValue("(s)", "blahdy blah");    
PyObject *keywords = PyDict_New();
PyDict_SetItemString(keywords, "somearg", Py_True);
PyObject *myobject_method = PyObject_GetAttrString(myobject, "do something");

PyObject *result = PyObject_Call(myobject_method, args, keywords);
Py_DECREF(args);
Py_DECREF(keywords);
Py_DECREF(myobject_method);

// Do something with the result

Py_DECREF(result);

もちろん、Python コードにエラーや例外があると、PyObject の一部が NULL になり、プログラムがクラッシュする可能性があります。NULL の結果を確認したり、 を使用したりするPy_DECREFX()ことで、これを回避できます。

于 2014-07-30T17:33:59.150 に答える
7

最後に、これを行うためにPyObject_Callを使用しました (ヒントをくれた Bakuriu に感謝します!)。誰かがそれを行う方法を知りたい場合に備えて、ここに私のコードがあります:

PyObject *args = Py_BuildValue("(s)", "blahdy blah");    
PyObject *keywords = PyDict_New();
PyDict_SetItemString(keywords, "somearg", Py_True);

PyObject_Call(PyObject_GetAttrString(myobject, "do something"), args, keywords);
Py_DECREF(args);
Py_DECREF(keywords);
于 2013-05-29T11:34:01.270 に答える