python调用c的函数
环境:vs2017,python3.6
网址:为python添加c++扩展
配置环境
python 环境
- 下载vs2017,网址:vs2017社区版
- 安装vs2017,注意:在线安装的时候选择安装python,默认安装python3.6
打开vs2017 -> 视图 ->其他窗口 ->python 环境
注意: python3.6为加粗加黑状态,则默认python3.6为全局默认状态,如果不是,在图上“包”里面选择概述->这是新项目的默认环境
- 文件->新建->项目->Python->Python应用程序->名称、位置
- 右键“解决方案camera”->添加->新建项目->Visual C++->常规->空项目->名称、位置
- 右键 “c++项目” ->添加->新建项->C++文件->名称、位置
- 右键 “c++项目” -> 属性 ->配置属性(添加图片),添加python包含目录,依赖库目录,库名称
- 右键“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代码中调用就可以获取到。如果有什么问题可以留言。