#include <iostream> #include <pybind11/embed.h> namespace py = pybind11; int main() { // start the interpreterand keep it alive py::scoped_interpreter guard{}; 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"; }
编译成功,运行报错:Fatal Python error: initfsencoding: unable to load the file system codec. ModuleNotFoundError: No module named ‘encodings’
原因在于:需要在用户变量中添加PYTHONHOME和PYTHONPATH两个变量,路径均为python文件夹
链接:链接
C++将python训练的模型导入并预测
#include <iostream> #include <pybind11/embed.h> #include <pybind11/numpy.h> #include <pybind11/stl.h> #include <vector> #include <array> #include <time.h> namespace py = pybind11; using namespace std; //*指针-->numpy 1D template<typename T> py::array_t<T> _ptr_to_arrays_1d(T* data, py::ssize_t col) { auto result = py::array_t<T>(col);//申请空间 py::buffer_info buf = result.request(); T* ptr = (T*)buf.ptr;//获取py::array的指针并隐式转换类型为T* for (auto i = 0; i < col; i++) ptr[i] = data[i]; return result; } //numpy 1D->interger,如[1]->1 int array_to_int(py::array data) { py::buffer_info buf = data.request(); int* ptr = (int*)buf.ptr; return *ptr; } //numpy 1D->vector vector<double> array_to_vector(py::array data, py::ssize_t col) { py::buffer_info buf = data.request(); double* ptr = (double*)buf.ptr; vector<double> res; for (int i = 0; i < col; i++) { res.push_back(ptr[i]); } return res; } //numpy 1D->array array<double,4> nparray_to_array(py::array data, py::ssize_t col) { py::buffer_info buf = data.request(); double* ptr = (double*)buf.ptr; array<double, 4> res; for (int i = 0; i < col; i++) { res[i] = ptr[i]; } return res; } //*指针-->numpy 1D template<typename T> py::array_t<T> ptr_to_arrays_1d(T* data, py::ssize_t col) { py::array_t<double> out = py::array_t<double>(col); auto r3 = out.mutable_unchecked<1>(); for (int i = 0; i < col; i++) r3(i) = data[i]; return out; } //*****测试******// int main1() { py::scoped_interpreter guard{};//python初始化 //*测试1D double data1[] = { 1.1,2.2,3.3,4.4 }; py::array_t<double> _arr1 = _ptr_to_arrays_1d(data1, 4); py::array_t<double> _arr2 = _ptr_to_arrays_1d(data1, 4); py::array_t<double> arr1 = ptr_to_arrays_1d(data1, 4); py::array_t<double> arr2 = ptr_to_arrays_1d(data1, 4); py::print(_arr1); py::print(_arr2); py::array a = _arr1.attr("reshape")(1, -1); py::print(a); int data2[] = { 1 }; py::array_t<int> _arr_test = _ptr_to_arrays_1d(data2, 1); int res = array_to_int(_arr_test); cout << res << endl; } int main() { // start the interpreterand keep it alive py::scoped_interpreter guard{}; auto math = py::module::import("math");//=import math double root_two = math.attr("sqrt")(2.0).cast<double>();//=math.sqrt(2.0) std::cout << "The square root of 2 is: " << root_two << "\n"; auto joblib2 = py::module::import("sklearn.externals").attr("joblib");//=from sklearn.externals import joblib auto datasets= py::module::import("sklearn").attr("datasets");//=from sklearn import datasets auto numpy = py::module_::import("numpy");//=import numpy auto randomForest = py::module::import("sklearn.ensemble").attr("RandomForestClassifier"); auto rfc2 = joblib2.attr("load")("G:/0/rfc.pkl");//加载模型 =rfc2 = joblib.load('G:/0/rfc.pkl') py::print(rfc2); double data1[] = { 5.1 ,3.5 ,1.4 ,0.2 }; py::array_t<double> _arr1 = _ptr_to_arrays_1d(data1, 4);//[5.1 3.5 1.4 0.2] py::array a = _arr1.attr("reshape")(1, -1);//=_attr1.reshape(1,-1),[[5.1 3.5 1.4 0.2]] py::print(a); auto predict_value = rfc2.attr("predict")(a);//=rfc2.predict(a) py::print(predict_value);//[0] int res = array_to_int(predict_value); cout << res << endl;//0 } //****测试代码运行速度*****// //numpy 1D->interger 0.193s //*指针-->numpy 1D 0.175s int main3() { py::scoped_interpreter guard{}; clock_t start, finish; start = clock(); int T = 10000; while (T--) { double data1[] = { 5.1 ,3.5 ,1.4 ,0.2 }; py::array_t<double> _arr1 = _ptr_to_arrays_1d(data1, 4); py::array a = _arr1.attr("reshape")(1, -1); } finish = clock(); cout << endl << "the time cost is:" << double(finish - start) / CLOCKS_PER_SEC << endl; } //****测试vector和numpy互转 int main4() { py::scoped_interpreter guard{}; vector<double> vi = { 1.1,2.2,3.3,4.4 }; double* data = vi.data();//vector->数组 cout << *data << endl; py::array_t<double> _arr1 = _ptr_to_arrays_1d(data, 4);//数组->numpy py::print(_arr1); vector<double> res = array_to_vector(_arr1, 4);//numpy->vector for (auto x : res) { cout << x << " "; } } //****测试array和numpy互转 int main5() { py::scoped_interpreter guard{}; array<double, 4> ar = { 1.1,2.2,3.3,4.4 }; double* data = ar.data();//array->数组 py::array_t<double> _arr1 = _ptr_to_arrays_1d(data, 4);//数组->numpy py::print(_arr1); array<double, 4> res = nparray_to_array(_arr1, 4);//numpy->array for (auto x : res) { cout << x << " "; } }