C与Python互调(2)

接上一篇博文

此次发现更佳方便的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
 

 

打完收工!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值