2010-12-02 5 views
18

C++에서 파이썬 함수를 호출하려고합니다. 함수 포인터를 통해 구현할 수 있다고 생각했지만 가능하지는 않습니다. 나는 이것을 달성하기 위해 boost.python을 사용했다.C++에서 파이썬 함수 호출

def callback(arg1, arg2): 
    #do something 
    return something 

지금 내가 거기에서 호출 할 수 있도록, C++에이 기능을 전달해야

파이썬에서 정의 된 함수가 말한다. 어떻게 이것을 달성하기 위해 boost.python을 사용하여 C++ 측에 코드를 작성합니까?

답변

15

이 어떤 이름있을 수 있습니다 경우 : a boost::python::object받는 함수에

패스를.

bp::object pycb; //global variable. could also store it in a map, etc 
void register_callback(bp::object cb) 
{ 
     pycb = cb; 
} 

은 일관된 이름으로 하나의 알려진 네임 스페이스에있는 경우 : 당신은 그냥 PyRun_SimpleString("myFunction()")을 사용

ret = pycb() 
+0

Thnks Matthew, 추가 질문이 있습니다. 여기에 파이썬 객체가 같은 스레드에서 호출되고 있습니다. 파이썬 개체가 전역이고 다른 스레드에서 호출 된 경우 어떻게됩니까? – Amar

+0

이 질문의 범위를 벗어나기는하지만 가능합니다. C/Python API의 PyGILState_ * 패밀리를 조사하는 것이 좋습니다. Boost-Python과 달리 Python은 매우 훌륭한 문서를 가지고 있습니다. 그래도 도움이 더 필요하면 다른 질문을하십시오. –

+2

미래의 시청자를 위해 : 누군가 다른 시청자에게 궁금한 점을 물었습니다. 여기 좀 봐 : stackoverflow.com/questions/8009613/boost-python-not-supporting-parallelism/8011153#8011153 –

4

실마리가 아닙니다. 그러나 일단 함수 객체가 있으면 PyObject_Call()을 사용하여 호출 할 수 있습니다.

+2

'boost :: python :: object'를 사용하고 있다면'operator()'를 사용하여 호출 할 수 있습니다. – eudoxos

2

이전에는 사용하지 않았지만 참조 설명서에는 Calling Python Functions and Methods이라는 섹션이 있으며이를 수행하는 방법이 나와 있습니다.

+1

Boost python 문서는 최신 버전이 아니며 최신 버전 인 경우에도 매우 나쁩니다. –

+0

아 ~ 나는 노력했다. :-) – Ken

+0

그 페이지는 당신에게 파이썬 함수를 보여주지 않습니다. 이미 바인딩 된 객체로 호출하는 방법을 보여줍니다. 정확하게 "간단한 예"는 아닙니다. – CashCow

1

모든 함수처럼 호출 할 수 있도록

bp::object

bp::object pycb = bp::scope("namespace").attr("callback"); 
operator()가 정의한 빠른 해킹으로, 내 함수 이름이 알려졌고 아무런 인수도 취하지 않고 __main__ 네임 스페이스에 살았습니다. 다중 스레드 인 경우 GIL 잠금을 추가로 확보해야합니다.