• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++调用Python基础功能实例详解

C++调用Python基础功能实例详解

作者:yangzifb 字体:[增加 减小] 来源:互联网 时间:2017-05-28

yangzifb 通过本文主要向大家介绍了c++调用python,c++ python,c++编程实例详解,c++编程实例详解pdf,c++指针详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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==0)
  {
    //Py_SetPythonHome(L"C:\\Python35");
    Py_Initialize(); //初始化
    p_main_Module =PyImport_ImportModule("__main__");
    if (!p_main_Module)
    {
      throw "";
    }
  }
}
void end()
{
  Py_Finalize(); //清理
}
</div>

程序部署时可以将c:\Python35\lib目录复制到执行程序路径下,或者通过Py_SetPythonHome(L"C:\\Python35");设置Python的安装目录。

C++调用Python的基本需求:

1、运行Python指令

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

2、加载Python模块

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

3、给Python的变量赋值

对于数值,使用Py_BuildValue:

Py_BuildValue("") None
Py_BuildValue("i", 123) 123
Py_BuildValue("iii", 123, 456, 789) (123, 456, 789)
Py_BuildValue("s", "hello") 'hello'
Py_BuildValue("ss", "hello", "world") ('hello', 'world')
Py_BuildValue("s#", "hello", 4) 'hell'
Py_BuildValue("()") ()
Py_BuildValue("(i)", 123) (123,)  
Py_BuildValue("(ii)", 123, 456) (123, 456)
Py_BuildValue("(i,i)", 123, 456) (123, 456)
Py_BuildValue("[i,i]", 123, 456) [123, 456]
Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) {'abc': 123, 'def': 456}
</div>

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

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

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

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

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); 
</div>

对于元组的解析:

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)
</div>

5、调用Python函数

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

 6、设置函数让Python调用

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

static int numargs=1890;
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, 0, NULL}
};
static PyModuleDef EmbModule = { //模块声明
  PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods,
  NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb(void) //模块初始化函数
{
  return PyModule_Create(&EmbModule);
}
//增加模块:
PyImport_AppendInittab("emb", &PyInit_emb); //增加一个模块
</div>

Python部分代码:

import emb
print("Number of arguments", emb.numargs())
</div>

以上所述是小编给大家介绍的C++调用Python基础功能实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++调用Python基础功能实例详解
  • C++/Php/Python/Shell 程序按行读取文件或者控制台的实现
  • C++/Php/Python 语言执行shell命令的方法(推荐)
  • 深入浅析 C++ 调用 Python 模块

相关文章

  • 2017-05-28浅谈C++中派生类对象的内存布局
  • 2017-05-28深入理解C语言中编译相关的常见错误
  • 2017-05-28C++中的三大函数和操作符重载(Boolan)
  • 2017-05-28C++ 类的构造函数详解及实例
  • 2017-05-28C数据结构之单链表详细示例分析
  • 2017-05-28MoveWindow() SetWindowPos()的区别于联系
  • 2017-05-28NSString与C字符串之间的相互转换
  • 2017-05-28详解C语言中结构体的自引用和相互引用
  • 2017-05-28重构-C++实现矩阵的简单实例
  • 2017-05-28C++实现两个日期间差多少天的解决方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • (C和指针) #if 0/#if 1...#end if
    • 贪心算法的C语言实现与运用详解
    • 深入剖析C++中的struct结构体字节对齐
    • C语言求向量和的两则问题解答分享
    • C语言辗转相除法求2个数的最小公约数
    • 数据结构之AVL树详解
    • C++ 类访问控制的条件总结
    • C++ 程序员为什么看不起php程序员
    • Linux下控制(统计)文件的生成的C代码实现
    • 详解C++编程中的嵌套类的声明与其中的函数使用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有