2013-05-27 3 views
5

내 C 응용 프로그램에 Python (2.7) 라이브러리를 포함시키고 Python/C API를 사용하여 C에서 Python 코드를 호출하려고합니다. 키워드를 사용하는 Python 메서드를 호출해야합니다 인수. 의미, 내가 파이썬에서 다음 줄에 해당하는 달성하기 위해 노력하고있어 다음 documentation을 읽어키워드 인수가있는 PyObject_CallMethod

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

을, 나는 다음과 같이 멀리 얻을 관리해야하지만,이 키워드 인수를 전달하지 않습니다 :

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

파이썬 슈퍼 익숙하지 않아요 및 설명서는이에 완전히 명확하지 않다 및 Google 검색이 중 많은 유용한 정보를 설정하지 않았다 나는이 종류의이 시점에서 붙어 있어요. 나는 어떤 도움을 주셔서 감사합니다.

+2

키워드 인수가있는 메소드를 호출하는 함수가없는 것처럼 보입니다. 적어도 [this] (http://mail.python.org/pipermail/python-dev/2007-June/073661.html)을 보아라. 그러나'PyObject_Call'은 항상 작동합니다. – Bakuriu

+0

@ 바쿠 리우 : 힌트 주셔서 감사합니다! 결국, 그것은 결국 제가 한 일입니다. –

답변

6

결국 나는 이것을하기 위해 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); 
5

Tamas의 대답은 작업을 완료하지만 메모리가 누출됩니다. 오류 또는 예외가 파이썬 코드가있는 경우 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()을 사용하면이를 피할 수 있습니다.