千家信息网

怎样使用C++调用Python代码

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章将为大家详细讲解有关怎样使用C++调用Python代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、配置python环境问题1.首先安装Python(版
千家信息网最后更新 2025年01月18日怎样使用C++调用Python代码

这篇文章将为大家详细讲解有关怎样使用C++调用Python代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、配置python环境问题

1.首先安装Python(版本无所谓),安装的时候选的添加python路径到环境变量中

安装之后的文件夹如下所示:

2.在VS中配置环境和库

右击项目->属性->VC++目录

1)包含目录:

Python安装路径/include

2)库目录:

Python安装路径/libs

右击项目->属性->连接器->输入->附加依赖库

debug下:

python安装目录/libs/python37_d.lib

release下:

python安装目录/libs/python37.lib

注意

1、debug配置的时候可能没有python37_d.lib,那就把python37.lib复制一个,然后重命名为python37_d.lib就可以啦

2、如果一直报错,但是包含头文件等都没有问题,那么你需要看一下你的python是32位还是64位的。然后根据python的环境去配置vs的环境。

二、C++调用python函数并输出返回值

首先可能有个坑!一定要保证这个python函数所在的文件能够正常运行!然后把python代码放到和C++代码同一目录下。

1、定义Python函数

#!python3# -*- coding:utf-8 -*-import base64import hmacfrom hashlib import sha1def hash_hmac(code , key): #sha1加密签名算法 hmac_code = hmac.new(key.encode() , code.encode() , sha1).digest() return base64.b64encode(hmac_code).decode()

2、编写C++代码

#include #includeusing namespace std;int main(){ Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化 if (!Py_IsInitialized()) { printf("初始化失败!"); return 0; } PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')");//这一步很重要,修改Python路径 PyObject* pModule = NULL;//声明变量 PyObject* pFunc = NULL;// 声明变量 pModule = PyImport_ImportModule("hash_hmac");//这里是要调用的文件名hash_hmac.py if (pModule == NULL) { cout << "没找到" << endl; } pFunc = PyObject_GetAttrString(pModule, "hash_hmac");//这里是要调用的函数名 //两个字符串参数 PyObject* pParams = Py_BuildValue("(ss)", "/oss/upload?bucket=test&filekey=test/image/3b/3ba9d94cab2f8868823d71c4445e125a.png\n" , "q4mJAS777BUbbdVpEqh3XRcZZqNyDweU4GRnM690"); char* result; PyObject* pRet = PyObject_CallObject(pFunc, pParams);//调用函数 int res = 0; PyArg_Parse(pRet, "s", &result);//转换返回类型 cout << "res:" << result << endl;//输出结果 Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。 return 0;}

3、解释部分C++代码

PyObject* pParams = Py_BuildValue("(ss)", "/oss/upload?bucket=test&filekey=test/image/3b/3ba9d94cab2f8868823d71c4445e125a.png\n" , "q4mJAS777BUbbdVpEqh3XRcZZqNyDweU4GRnM690");

在这里我输入了两个字符串类型的参数,Py_BuildValue()函数的作用和PyArg_ParseTuple()的作用相反,它将C类型的数据结构转换成Python对象。

该函数可以和PyArg_ParseTuple()函数一样识别一系列的格式串,但是输入参数只能是值,而不能是指针。

它返回一个Python对象和PyArg_ParseTuple()不同的一点是PyArg_ParseTuple()函数它的第一个参数为元组,Py_BuildValue()则不一定会生成一个元组。它生成一个元组仅仅当格式串包含两个或者多个格式单元,如果格式串为空,返回NONE。

在下面的描述中,括号中的项是格式单元返回的Python对象类型,方括号中的项为传递的C的值的类型。

"s" (string) [char *] :将C字符串转换成Python对象,如果C字符串为空,返回NONE。

"s#" (string) [char *, int] :将C字符串和它的长度转换成Python对象,如果C字符串为空指针,长度忽略,返回NONE。

"z" (string or None) [char *] :作用同"s"。

"z#" (string or None) [char *, int] :作用同"s#"。

"i" (integer) [int] :将一个C类型的int转换成Python int对象。

"b" (integer) [char] :作用同"i"。

"h" (integer) [short int] :作用同"i"。

"l" (integer) [long int] :将C类型的long转换成Pyhon中的int对象。

"c" (string of length 1) [char] :将C类型的char转换成长度为1的Python字符串对象。

"d" (float) [double] :将C类型的double转换成python中的浮点型对象。

"f" (float) [float] :作用同"d"。

"O&" (object) [converter, anything] :将任何数据类型通过转换函数转换成Python对象,这些数据作为转换函数的参数被调用并且返回一个新的Python对象,如果发生错误返回NULL。

"(items)" (tuple) [matching-items] :将一系列的C值转换成Python元组。

"[items]" (list) [matching-items] :将一系列的C值转换成Python列表。

"{items}" (dictionary) [matching-items] :将一系类的C值转换成Python的字典,每一对连续的C值将转换成一个键值对。

例如:

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}

Py_BuildValue("((ii)(ii)) (ii)", 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))

3、运行C++程序

与Python代码的预期相同。

三、Python代码处理

在发布软件的时候,通常我们都不希望代码可以直接被别人看到。

以上的Debug目录中的exe要想能够单独运行,必须把python脚本拷过去。为了不让别人能直接看到我的代码,我拷过去的是生成的.pyc文件,实现了一个简单的python代码的加密。不过据说可以反编译,但是对我来说已经够了。

四、.py和.pyc的区别

原来Python的程序中,是把原始程序代码放在.py文件里,而Python会在执行.py文件的时候。将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了加快下次执行文件的速度。

所以,在我们运行python文件的时候,就会自动首先查看是否具有.pyc文件,如果有的话,而且.py文件的修改时间和.pyc的修改时间一样,就会读取.pyc文件,否则,Python就会读原来的.py文件。

其实并不是所有的.py文件在与运行的时候都会产生.pyc文件,只有在import相应的.py文件的时候,才会生成相应的.pyc文件。

五、使用.py生成.pyc

在命令行下使用下列命令即可:

python -m py_compile test.py#单文件python -m py_compile /root/src/{file1,file2}.py#多文件

关于"怎样使用C++调用Python代码"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

文件 代码 函数 对象 类型 C++ 作用 字符 字符串 时候 目录 参数 格式 环境 生成 运行 程序 路径 配置 两个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络技术公司杭州分公司 极光代理ip服务器解决上网限制 穿越火线枪战王者切换服务器 如何在网上建设服务器安全 吉林省信安网络技术公司 华为ipv6服务器 网络安全专家变黑客 关于网络安全带的政治题答案 抖音小程序个性化软件开发支持 对网络安全法规的了解学习 信息网络安全海报插画 plsql数据库字段 软件开发财税 苏亚星目前没有可登录的服务器 万德数据库机构名片 ftp服务器更改用户名和密码 高防服务器切换 上海市计算机三级数据库技术 租数据库一个月多少钱 软件开发可做自动化吗 公路养护管理系统主题数据库 汽修数据库软件 网络安全知识板报图片 哪家网络安全公司最好 vivoxg手机服务器设置方法 软件开发项目进度管理的研究 什么是服务器渲染 数据库管理系统第几代计算机出现 u8绩效管理连接服务器失败 软件开发和信息服务合同范本
0