귀하의 질문에 대한 답은 실제로 두 부분으로 나뉩니다. 하나는 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.html 및 http://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
를) 임베디드 파이썬 인터프리터를 시작하고 호출하는 기본 예제입니다 로 나타났다.