python调用c的函数

python调用c的函数

环境:vs2017,python3.6
网址:为python添加c++扩展


配置环境

python 环境
  1. 下载vs2017,网址:vs2017社区版
  2. 安装vs2017,注意:在线安装的时候选择安装python,默认安装python3.6
  3. 打开vs2017 -> 视图 ->其他窗口 ->python 环境

    注意: python3.6为加粗加黑状态,则默认python3.6为全局默认状态,如果不是,在图上“包”里面选择概述->这是新项目的默认环境
    
  4. 文件->新建->项目->Python->Python应用程序->名称、位置
  5. 右键“解决方案camera”->添加->新建项目->Visual C++->常规->空项目->名称、位置
  6. 右键 “c++项目” ->添加->新建项->C++文件->名称、位置
  7. 右键 “c++项目” -> 属性 ->配置属性(添加图片),添加python包含目录,依赖库目录,库名称
  8. 右键“c++项目”-> 属性 ->常规 ->目标文件名(生成python库名称)、目标文件扩展名(.pyd);属性->常规->项目默认值->配置类型->动态库(.dll)。

代码实现

c++代码

#include <iostream>
#include <Python.h>
using namespace std;
vector<int>images_data;
for(int i=0;i<5;i++){
    images_data.push_back(i);
}
//传数字("i"代表整型)
PyObject* get_image_size(PyObject* self, PyObject* o)
{   
    int length = images_data.size();
    return Py_BuildValue("i", length);
}
//传数组,将vector转成tuple
PyObject* get_image_data(PyObject* self, PyObject* o)
{
    PyObject* tuple = PyTuple_New(images_data.size());
    for (int i = 0; i < images_data.size(); i++) {
        PyTuple_SetItem(tuple, i, Py_BuildValue("i", images_size[i]));
    }
    return tuple;
}
//加锁
PyObject* camera_lock(PyObject* self, PyObject* o) {
    images_data.lock();
    return o;
}
//解锁
PyObject* camera_unlock(PyObject* self, PyObject* o) {
    images_data.unlock();
    return o;
}
//将封装的函数放到这个模块中
static PyMethodDef panoramamodule_methods[] = { 
    { "get_image_size", (PyCFunction)get_image_size, METH_O, nullptr },
    { "get_image_data", (PyCFunction)get_image_data, METH_O, nullptr },
    { "camera_lock", (PyCFunction)camera_lock, METH_O, nullptr },
    { "camera_unlock", (PyCFunction)camera_unlock, METH_O, nullptr },
    { nullptr, nullptr, 0, nullptr }
};
//定义模块
static PyModuleDef panoramamodule_module = {
    PyModuleDef_HEAD_INIT,
    "panoramamodule",
    "Provides panorama image data",
    0,
    panoramamodule_methods
};
//创建模块,模块名称与生成的.pyd的名称保持一致
PyMODINIT_FUNC PyInit_panoramamodule() {
    return PyModule_Create(&panoramamodule_module);
}

python 代码


#引入panoramamodule,我没有找到不传参的办法,就暂且传了个0
from panoramamodule import *
import numpy as np
image_size =get_image_size(0)
image_data =np.array(get_image_data(0))

总结

本人测试这些是可行的,将数据或者函数包装成python模块下的函数,在python代码中调用就可以获取到。如果有什么问题可以留言。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值