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 】
相关推荐:
浅述节点的创建及常见功能的实现
C语言设计一个闪闪的圣诞树
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
Laravel如何处理异常和错误?(Handler示例)
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
微信推文制作网站有哪些,怎么做微信推文,急?
Java垃圾回收器的方法和原理总结
魔方云NAT建站如何实现端口转发?
如何快速搭建高效香港服务器网站?
手机网站制作与建设方案,手机网站如何建设?
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
Python函数文档自动校验_规范解析【教程】
Laravel如何发送系统通知?(Notification渠道示例)
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
太平洋网站制作公司,网络用语太平洋是什么意思?
浅谈redis在项目中的应用
nginx修改上传文件大小限制的方法
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
php json中文编码为null的解决办法
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
香港服务器租用每月最低只需15元?
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
如何在腾讯云免费申请建站?
,怎么在广州志愿者网站注册?
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
如何在宝塔面板中创建新站点?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何在建站之星绑定自定义域名?
如何在云主机快速搭建网站站点?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
EditPlus 正则表达式 实战(3)
Python文本处理实践_日志清洗解析【指导】
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
详解vue.js组件化开发实践
详解Oracle修改字段类型方法总结
js代码实现下拉菜单【推荐】
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何在云指建站中生成FTP站点?
,南京靠谱的征婚网站?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Python结构化数据采集_字段抽取解析【教程】
如何快速查询网站的真实建站时间?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践

