c++调用Python首先安装Python,以win7为例,Python路径为:c:\Python35\,通过mingw编译c++代码。
编写makefile文件,首先要添加包含路径:
inc_path += c:/Python35/include
然后添加链接参数:
ld_flag += c:/Python35/libs/libpython35.a
在源文件中添加头文件引用:
#include "Python.h"
Python解释器需要进行初始化,完成任务后需要终止:

 void start()
{
int r=Py_IsInitialized(); //1为已经初始化了
if (r==)
{
//Py_SetPythonHome(L"C:\\Python35");
Py_Initialize(); //初始化
p_main_Module =PyImport_ImportModule("__main__");
if (!p_main_Module)
{
throw "";
}
}
}
void end()
{
Py_Finalize(); //清理
}

程序部署时可以将c:\Python35\lib目录复制到执行程序路径下,或者通过Py_SetPythonHome(L"C:\\Python35");设置Python的安装目录。
C++调用Python的基本需求:
1、运行Python指令

PyRun_SimpleString("print(os.getcwd(),a)");
pyext.eval(R"(a+='qwer')");

2、加载Python模块

PyObject * pModule =PyImport_ImportModule("tp");  //test:Python文件名,若脚本有错则返回空
PyRun_SimpleString("import os");

3、给Python的变量赋值

对于数值,使用Py_BuildValue:

Py_BuildValue("") None
Py_BuildValue("i", )
Py_BuildValue("iii", , , ) (, , )
Py_BuildValue("s", "hello") 'hello'
Py_BuildValue("ss", "hello", "world") ('hello', 'world')
Py_BuildValue("s#", "hello", ) 'hell'
Py_BuildValue("()") ()
Py_BuildValue("(i)", ) (,)
Py_BuildValue("(ii)", , ) (, )
Py_BuildValue("(i,i)", , ) (, )
Py_BuildValue("[i,i]", , ) [, ]
Py_BuildValue("{s:i,s:i}", "abc", , "def", ) {'abc': , 'def': }

对于其他数据结构,使用相应的函数设置,例如:

PyObject *pArgs = PyTuple_New();
PyObject *pDict = PyDict_New(); //创建字典类型变量
PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao")); //往字典类型变量中填充数据
PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", )); //往字典类型变量中填充数据
PyTuple_SetItem(pArgs, , pDict);//0---序号 将字典类型变量添加到参数元组中

构造好对象以后,通过PyObject_SetAttrString来设置进入Python中:

PyObject *ps=PyUnicode_DecodeUTF8(val,strlen(val),"ignore"); //构造了一个对象
PyObject_SetAttrString(p_main_Module,key,ps); //设置

4、获取Python变量的值
首先取得变量的指针,然后通过PyArg_Parse解析

pModule =PyImport_ImportModule("__main__");
pReturn = PyObject_GetAttrString(pModule, "a"); //可以获得全局变量
int size = PyDict_Size(pReturn);
PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age");
int newAge;
PyArg_Parse(pNewAge, "i", &newAge);

对于元组的解析:

int ok;
ok = PyArg_ParseTuple(args, "s", &s); //Python call: f('whoops!')
ok = PyArg_ParseTuple(args, "lls", &k, &l, &s);//Python call: f(1, 2,'three')
ok = PyArg_ParseTuple(args, "(ii)s#", &i, &j, &s, &size);//Python call: f((1, 2), 'three')
ok = PyArg_ParseTuple(args, "s|si", &file, &mode, &bufsize);//Python calls:
//f('spam')
//f('spam', 'w')
//f('spam', 'wb', 100000)

5、调用Python函数

PyObject * pfun=PyObject_GetAttrString(pModule, "testdict"); //testdict:Python文件中的函数名
PyObject *pReturn = PyEval_CallObject(pfun, pArgs); //调用函数

6、设置函数让Python调用
首先定义c函数,然后声明方法列表,然后声明模块,然后增加这个模块,最后调用

static int numargs=;
static PyObject* emb_numargs(PyObject *self, PyObject *args) //C函数
{
if(!PyArg_ParseTuple(args, ":numargs"))
return NULL;
return PyLong_FromLong(numargs);
}
static PyMethodDef EmbMethods[] = { //方法列表
{"numargs", emb_numargs, METH_VARARGS,
"Return the number of arguments received by the process."},
{NULL, NULL, , NULL}
};
static PyModuleDef EmbModule = { //模块声明
PyModuleDef_HEAD_INIT, "emb", NULL, -, EmbMethods,
NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb(void) //模块初始化函数
{
return PyModule_Create(&EmbModule);
}
//增加模块:
PyImport_AppendInittab("emb", &PyInit_emb); //增加一个模块
Python部分代码:
import emb
print("Number of arguments", emb.numargs())

c++调用Python基础功能的更多相关文章

  1. Python基础------列表,元组的调用方法

    Python基础------列表,元组的调用方法@@@ 一. 列表 Python中的列表和歌曲列表类似,也是由一系列的按特定顺序排列的元素组成的,在内容上,可以将整数,实数,字符串,列表,元组等任何类 ...

  2. Python基础(函数,函数的定义,函数的调用,函数的参数,递归函数)

    1.函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = ...

  3. 5分钟记住列表的使用功能-Python基础前传(7)

    学习任何一门技术,最重要的是逻辑而不是内容,仅会内容,我们仅仅是技术的使用者,但如果我们懂得了技术背后的逻辑,我们就是技术的创造者,所以同样领域的工作,有人月入5千,有人月入5万,就是这个差别: 学技 ...

  4. python基础之字典功能

    python中字典是个很重要的功能,使用键值(key-value)存储,具有极快的查找速度.值得注意的是,字典的key要为不可变对象,比如字符串.字母,但不能是可变的,比如列表等. 1.字典的定义: ...

  5. Python小白的发展之路之Python基础(一)

    Python基础部分1: 1.Python简介 2.Python 2 or 3,两者的主要区别 3.Python解释器 4.安装Python 5.第一个Python程序 Hello World 6.P ...

  6. Python之路3【第一篇】Python基础

    本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...

  7. 进击的Python【第三章】:Python基础(三)

    Python基础(三) 本章内容 集合的概念与操作 文件的操作 函数的特点与用法 参数与局部变量 return返回值的概念 递归的基本含义 函数式编程介绍 高阶函数的概念 一.集合的概念与操作 集合( ...

  8. 进击的Python【第二章】:Python基础(二)

    Python基础(二) 本章内容 数据类型 数据运算 列表与元组的基本操作 字典的基本操作 字符编码与转码 模块初探 练习:购物车程序 一.数据类型 Python有五个标准的数据类型: Numbers ...

  9. python基础之day1

    Python 简介 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Python为我们提供了非常完善的基础代码库,覆盖了 ...

随机推荐

  1. 剑指offer——27. 二叉搜索树与双向链表(Java版)

    题目: 剑指offer的题目有挺多都挺典型的,就像这一道.不过书中的代码写的真是ugly,有很多题目LeetCode上都有,可以去LeetCode讨论区看看,经常有一些大神分享,写的代码真是高效.简洁 ...

  2. LeetCode7.整数反转 JavaScript

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...

  3. Java基础——线程复习总结

                                                                                                    线程 T ...

  4. git使用过程的问题与解决办法

    一.什么是Git Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程: Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote ...

  5. 带你解析Java类加载机制

      目录 Java类加载机制的七个阶段 加载 验证 准备(重点) 解析 初始化(重点) 使用 卸载 实战分析 方法论 树义有话说 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如 ...

  6. vue 父子组件相互传值

    子传父 逻辑: 单击子组件的按钮 ,触发它的单击事件   通过 $emit 触发父级自定义事件 并传一个值给父级 <div id="id"> <h3>儿子 ...

  7. vue项目中使用vuex

    1.运行 cnpm i vuex -S 2.导入包 import Vuex from 'vuex' 3.注册vuex到vue中 Vue.use(vuex) 4. var store = new Vue ...

  8. Linux环境中配置环境变量无效

    1.在Linux系统中的[ ~/.baserc ]文件与[ /etc/profile ]配置环境变量后(可以使任意环境变量)无效的现象,如下为解决办法: 使用命令: vim ~/.zshrc 在 [# ...

  9. 用 jQuery 实现表单验证(转载)

    jQuery 官方 API 地址: http://api.jquery.com/ 在线引用 jQuery:http://code.jquery.com/ ——选自<锋利的jQuery>(第 ...

  10. U盘被分区后恢复方法

    一:运行cmd 二:输入diskpart,按enter. 三:输入list disk,按enter. 四:选择优U盘,输入select disk X(X代表磁盘后面的数字0.1,可磁盘的大小来判断数字 ...