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

发布时间 - 2026-01-11 00:45:14    点击率:

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(); //清理
}

程序部署时可以将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", 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}

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

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---序号 将字典类型变量添加到参数元组中 

构造好对象以后,通过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=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); //增加一个模块

Python部分代码:

import emb
print("Number of arguments", emb.numargs())

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


# c  # 调用python  # Python调用C/C++动态链接库的方法详解  # Python调用C++程序的方法详解  # 深入浅析 C++ 调用 Python 模块  # 详解C++调用Python脚本中的函数的实例代码  # 使用C++调用Python代码的方法详解  # 使用C++调用Python代码的方法步骤  # C++调用python(执行py文件)的全过程  # 小编  # 在此  # 数据结构  # 给大家  # 为例  # 可以获得  # 完成任务  # 所述  # 给我留言  # 有错  # 感谢大家  # 安装目录  # 组中  # 疑问请  # 有任何  # 头文件  # 加载  # 全局变量  # pModule  # PyObject 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在沈阳梯子盘古建站优化SEO排名与功能模块?  IOS倒计时设置UIButton标题title的抖动问题  如何彻底卸载建站之星软件?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  网站制作企业,网站的banner和导航栏是指什么?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何在景安服务器上快速搭建个人网站?  如何在云主机快速搭建网站站点?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何快速选择适合个人网站的云服务器配置?  Laravel API资源类怎么用_Laravel API Resource数据转换  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Windows Hello人脸识别突然无法使用  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Laravel distinct去重查询_Laravel Eloquent去重方法  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何快速搭建高效香港服务器网站?  如何快速搭建二级域名独立网站?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Android滚轮选择时间控件使用详解  JavaScript实现Fly Bird小游戏  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  如何选择可靠的免备案建站服务器?  ,在苏州找工作,上哪个网站比较好?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  微信小程序制作网站有哪些,微信小程序需要做网站吗?  在Oracle关闭情况下如何修改spfile的参数  如何用AWS免费套餐快速搭建高效网站?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何挑选最适合建站的高性能VPS主机?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel storage目录权限问题_Laravel文件写入权限设置  使用C语言编写圣诞表白程序  装修招标网站设计制作流程,装修招标流程?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Swift中swift中的switch 语句  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  如何挑选高效建站主机与优质域名?  如何打造高效商业网站?建站目的决定转化率  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?