接上一篇博文
此次发现更佳方便的C和Python互调 互相传参的方式..
不多废话 直接上代码
C++代码:
#include <boost/python.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/python/call_method.hpp>
#include <vector>
#include <iostream>
#include <Python.h>
#include <string>
#include <boost/thread/thread.hpp>
boost::mutex io_mutex;
#include <boost/python/stl_iterator.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <fstream>
using namespace std;
namespace bp = boost::python;
template<typename T>
void python_to_vector(bp::object o, vector<T> &v) {
bp::stl_input_iterator<T> begin(o);
bp::stl_input_iterator<T> end;
v.clear();
v.insert(v.end(), begin, end);
}
template<class T>
bp::list std_vector_to_py_list(const std::vector<T>& v)
{
bp::object get_iter = bp::iterator<std::vector<T> >();
bp::object iter = get_iter(v);
bp::list l(iter);
return l;
}
template <class T>
bp::list toPythonList(std::vector<T> vector) {
typename std::vector<T>::iterator iter;
bp::list list;
for (iter = vector.begin(); iter != vector.end(); ++iter) {
list.append(*iter);
}
return list;
}
bool readData(std::string _path, std::vector<double> &_vec, int _rows, int _cols) {
std::ifstream infile(_path, std::ios::in);
if (!infile.is_open()) {
return false;
}
double temp;
_vec.push_back(_rows);
_vec.push_back(_cols);
while (!infile.eof()) {
infile >> temp;
_vec.push_back(temp);
}
return true;
}
void newPython() {
boost::mutex::scoped_lock
lock(io_mutex);
Py_Initialize();
try
{
bp::object module;
bp::object instance_ori;
bp::object instance;
vector<double> vec_ori_2DB;
vec_ori_2DB.push_back(1.0);
vec_ori_2DB.push_back(2.0);
// readData("data_2DB.txt", vec_ori_2DB, 24, 76);
vector<double> vec_ori_2DVd;
vec_ori_2DVd.push_back(3.5);
vec_ori_2DVd.push_back(5.5);
// readData("data_2DVd.txt", vec_ori_2DVd, 24, 1);
bp::list l_ori_Vd, l_ori_B;
l_ori_Vd = toPythonList(vec_ori_2DB);
l_ori_B = toPythonList(vec_ori_2DVd);
//l_ori = std_vector_to_py_list(vec_ori); // error
module = bp::import("Demo");
instance = module.attr("myAdd")(l_ori_Vd, l_ori_B);
bp::object obre = instance.attr("add")();
vector<double> res;
python_to_vector(obre, res);
for (int i = 0; i< res.size(); i++)
cout << res[i] << endl;
}
catch (...)
{
PyErr_Print();
PyErr_Clear();
}
}
int main()
{
Py_Initialize();
try
{
bp::object module = bp::import("sys");
bp::object pythonpath = module.attr("path");
}
catch (...)
{
PyErr_Print();
PyErr_Clear();
}
newPython();
return 0;
}
Python代码:
class myAdd():
def __init__(self,data_Vd, data_B):
self.data_Vd = data_Vd
self.data_B = data_B
self.result=[]
def add(self): #__init__(self):
for i in range(len(self.data_Vd )):
x = self.data_Vd[i]+ self.data_B[i]
self.result.append(x)
return self.result
运行结果:
4.5
7.5
下面介绍一下 如何把整理好的程序 打包Python库
只需要把Python安装路径下的 "..Python\Python36\Lib" 目录和 "libs"目录及对应的.dll 文件拷贝到你的工程下
并且在
C代码中 "Py_Initialize();" 之前 加上 "Py_SetPythonHome(L"../你的路径"); " 即可..
如果Python中安装了其他的Python库 这些库会存在于"Lib\site-packages\"下
所以在调用Python代码时添加对应的库路径即可
如:
import sys
import os
sys.path.insert(0, os.path.join(
os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
r'lib\3rdParty\Python_Boost\Py\libs\site-packages')
)
import numpy as np
import cvxopt
from cvxopt.solvers import qp
from cvxopt import matrix
打完收工!