2017-03-01 207 views
0

Pybind11을 사용하여 main() 함수를 포함하는 C++ 코드에서 파이썬 함수를 호출하려고합니다. 그러나 사용할 수있는 참조가 거의 없다는 사실을 발견했습니다. 대부분의 기존 문서는 역방향에 대해 이야기합니다. 즉 파이썬에서 C++을 호출합니다.pybind11을 사용하여 C++에서 파이썬 함수를 호출합니다.

어떻게 수행하는지 보여주는 완벽한 예가 있습니까? 내가 찾은 유일한 참고 자료는 다음과 같습니다. https://github.com/pybind/pybind11/issues/30

그러나 정보는 거의 없습니다.

답변

2

귀하의 질문에 대한 답은 실제로 두 부분으로 나뉩니다. 하나는 C++에서 파이썬 함수를 호출하는 것이고, 다른 하나는 인터프리터를 포함하는 것입니다.

pybind11에서 함수를 호출하는 것은 해당 함수를 pybind11::object 변수로 가져 오는 것입니다. operator()을 호출하여 개체 호출을 시도 할 수 있습니다. (함수 일 필요는 없지만 호출 가능한 것 : 예를 들어, __call__ 메쏘드를 가진 객체 일 수도 있습니다).

auto math = py::module::import("math"); 
auto resultobj = math.attr("sqrt")(2); 
double result = resultobj.cast<double>(); 

또는 당신은 단지에 모두 응축 수 있습니다 : 예를 들어, C++ 코드에서 math.sqrt(2)를 호출하면 사용하십시오

double result = py::module::import("math").attr("sqrt")(2).cast<double>(); 

질문의 두 번째 부분은에서이 작업을 수행하는 방법을 포함한다 C++ 실행 파일. 실행 파일을 만들 때 (예 : C++ 코드에 main()이 포함되어있을 때) Python 인터프리터를 파이썬과 함께 (파이썬 함수 호출과 같이)하기 전에 바이너리에 임베드해야합니다.

임베디드 지원은 현재 pybind11 master 브랜치 (2.2 릴리스가 될 예정)에 추가 된 새로운 기능입니다. http://pybind11.readthedocs.io/en/master/advanced/pycpp/object.htmlhttp://pybind11.readthedocs.io/en/master/advanced/embedding.html에서 사용할 수 호출 기능과 삽입됩니다의

The square root of 2 is: 1.41421 

더 많은 예제와 문서 :

#include <pybind11/embed.h> 
#include <iostream> 

namespace py = pybind11; 

int main() { 
    py::scoped_interpreter python; 

    auto math = py::module::import("math"); 
    double root_two = math.attr("sqrt")(2.0).cast<double>(); 

    std::cout << "The square root of 2 is: " << root_two << "\n"; 
} 

출력 : 여기에 파이썬 함수 (math.sqrt를) 임베디드 파이썬 인터프리터를 시작하고 호출하는 기본 예제입니다 로 나타났다.