2013-05-27 33 views
5

私のCアプリケーションにPython(2.7)ライブラリを埋め込もうとしていて、Python/C APIを使ってCからPythonコードを呼び出しています。キーワードを取るPythonメソッドを呼び出す必要があります議論意味的に、私はPythonで次の行の同等を達成しようとしています:documentationを読み取ることによりキーワード引数を持つPyObject_CallMethod

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

を、私は以下の限りを取得するために管理しているが、これはキーワード引数に渡すことはありません。 :

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

私は、Pythonとスーパー慣れていないんだとドキュメンテーションは、この上完全には明らかではなく、Google検索がいずれかの多くの有用な情報を上げていなかったように私は一種のこの時点で立ち往生しています。私はどんな助けにも感謝しています。

+2

キーワード引数を持つメソッドを呼び出す関数がないようです。少なくとも、[this](http://mail.python.org/pipermail/python-dev/2007-June/073661.html)を見てください。しかし、 'PyObject_Call'は常に動作します。 – Bakuriu

+0

@バカリュウ:ヒントありがとう!結局、それはまさに私がやったことです。 –

答えて

6

最後に私はこれを行うためにPyObject_Callを使用しました(ヒントのためにバクリュウに感謝!)。念のために誰もがそれを行う方法を不思議、ここに私のコードは次のとおりです。

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); 
5

タマスの答えは仕事を得るだろうが、それはまた、メモリリークが発生します。リークを回避するために、エラーまたは例外がPythonコードであるかどうPyObjectsのいくつかはNULLになり、あなたのプログラムはおそらくクラッシュします、もちろん

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); 

を使用しています。 NULL結果を確認したり、Py_DECREFX()を使用すると、これを回避できます。

関連する問題