千家信息网

C++如何调用python

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,小编给大家分享一下C++如何调用python,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、首先要配好vs开发工程注意版
千家信息网最后更新 2025年01月16日C++如何调用python

小编给大家分享一下C++如何调用python,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

1、首先要配好vs开发工程

注意版本;我这使用32位的python那么我vs工程这边也选择32位的编译环境去配置

注意点;需要将python安装目录的一些文件拷过来作为vs工程使用。

2、C++调用Python结果

py代码

这里引用了cdll库也需要放置到运行目录,py文件也是需要放置到运行目录(也就是exe生成所在目录)

import osimport timefrom ctypes import *def testDLL():    pDll = CDLL("./pythonTestCDll.dll")    pstr = create_string_buffer(1024,  '\0')    # 创建字符串缓冲区    # 对输入输出参数进行声明    GetAndSetString = pDll.GetAndSetString    GetAndSetString.restype = c_char_p    GetAndSetString.argtypes = [c_char_p]    pchar = GetAndSetString(pstr)    szbuffer = c_char_p(pchar)  # 强制转换为c_char_p类型,取其value值    print(pstr.value)    print(szbuffer.value)def Start():    testDLL()

C++代码

#include #include "Python.h"using namespace std;void Hello();void Add();void Start();void Hello1(){        cout << "\n调用Test001.py中的Add函数..." << endl;}int main(int argc, char* argv[]){        /*cout << "调用Test001.py中的Hello函数..." << endl;        Hello();        cout << "\n调用Test001.py中的Add函数..." << endl;        Add();*/        cout << "调用testMultiprocessingDll.py中的Start函数..." << endl;        Start();        getchar();        return 0;}void Start(){        Py_Initialize();//调用Py_Initialize()进行初始化        if (!Py_IsInitialized()) {                printf("Python envirment initialized fale!");                return;        }        PyObject * pModule = NULL;        PyObject * pFunc = NULL;        PyRun_SimpleString("import sys");        PyRun_SimpleString("sys.path.append('D:/code/pythonTestCDll/CdoPython/Release/DLLs')");        //PyRun_SimpleString("print(\"sdasd\")");        pModule = PyImport_ImportModule("testMultiprocessingDll");//调用的Python文件名  py文件放置exe同级        if (pModule == NULL)        {                PyErr_Print();                cout << "PyImport_ImportModule Fail!" << endl;                return;        }        pFunc = PyObject_GetAttrString(pModule, "__main__");//调用的函数名        PyEval_CallObject(pFunc, NULL);//调用函数,NULL表示参数为空        Py_Finalize();//调用Py_Finalize,和Py_Initialize相对应的.}void Hello(){        Py_Initialize();//调用Py_Initialize()进行初始化        if (!Py_IsInitialized()) {                printf("Python envirment initialized fale!");                return ;        }        PyObject * pModule = NULL;        PyObject * pFunc = NULL;        PyRun_SimpleString("print(\"sdasd\")" );        pModule = PyImport_ImportModule("Test001");//调用的Python文件名  py文件放置exe同级        if (pModule == NULL)        {                PyErr_Print();                cout << "PyImport_ImportModule Fail!" << endl;                return;        }        pFunc = PyObject_GetAttrString(pModule, "Hello");//调用的函数名        PyEval_CallObject(pFunc, NULL);//调用函数,NULL表示参数为空        Py_Finalize();//调用Py_Finalize,和Py_Initialize相对应的.}//调用Add函数,传两个int型参数void Add(){        Py_Initialize();        PyObject * pModule = NULL;        PyObject * pFunc = NULL;        pModule = PyImport_ImportModule("Test001");//Test001:Python文件名        pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python文件中的函数名                                                                                                   //创建参数:        PyObject *pArgs = PyTuple_New(2);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数        PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序号,i表示创建int型变量        PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序号                                                                                                         //返回值        PyObject *pReturn = NULL;        pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数                                                                                          //将返回值转换为int类型        int result;        PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量        cout << "6 + 8 = " << result << endl;        Py_Finalize();}

3、报错:ValueError: source code string cannot contain null bytes

参考链接:

https://blog.csdn.net/LaoYuanPython/article/details/97623504

https://blog.csdn.net/zichen_ziqi/article/details/79068656

4、C++调用python文件中import时报错

参考链接://www.yisu.com/article/233313.htm

5、C++多线程调用Python多进程multiprocessing时发现不支持

C++多线程调用Python多进程

C++、Java等编程想提高效率,很容易想到的就是使用多线程,而在Python中,由于使用了GIL,使得多线程效率非但没有将性能线性提升,反而可能会比单线程效率还低。在进程间不需要怎么通信的时候,multiprocessing就很好用了。但是翻遍了C/Python API没找到C语言调用Python多进程的方法。而目前的项目却恰好希望能用C++调用Python多进程。尝试了好多C/Python API都没有一个稳定可靠的方案,今天终于试出来了一种可行的方案!

该方案的前提是进程间不需要通信!

方法很简单,使用linux的shell启动python进程!

C++部分思路:

1. 使用c++创建多个线程,根据自己的逻辑写好入口函数和输入参数

2. 在线程入口函数中,将想要执行的linux命令封装成一个字符串如s="python test.py a b c",其中a,b,c是test.py的系统参数,完成了C++向python的传参,当然只是一些简单的类型

3. 定义好python的控制台上的输出,使用popen()执行s的命令并建立管道

4. 获取控制台的输出,并按照已定义好的规则来判断返回信息

5. 根据返回信息,执行对应的操作

Python部分思路:

基本不用修改,只是把普通的函数传参改为获取系统参数,将函数返回值改为控制台输出,当然返回值类型受限

该方案成功解决了C++多线程调用Python多进程的问题,提升了效率,缺点是进程间不能通信,只能相互传递比较简单的参数!

以上是"C++如何调用python"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

函数 C++ 参数 文件 进程 线程 方案 目录 类型 输出 工程 文件名 篇文章 参考 控制 通信 代码 信息 入口 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 山东ipfs服务器虚拟主机 智能科学与网络安全研究所 武汉大学网络安全李炳辉 无锡加工软件开发价格实惠 西门子博途无法添加数据库控件 电子支付软件开发前景 秦皇岛原装服务器价格 海南云电互联网科技有限公司 电脑软件开发首先要怎么做 土地数据库图形颜色 软件开发总包项目 黄淮学院考试数据库 软件工程二手市场软件开发书 茂名通信软件开发商家 水滴角测试仪软件开发 网络网络安全大赛是比什么 上海个人软件开发诚信经营 基础防护服务器 网络安全设备升级的请示 广东知名软件开发公司 数据库掩码设置显示部分数据 重庆编程软件开发教程 网络安全技术会查ip吗 智能化软件开发报价选择 铜梁区网络软件开发服务代理商 无悔华夏获取服务器 网络安全措施政策 徐州开发区互联网科技公司 辽宁服务器机房推荐厂家 计算机网络技术适合女生学吗
0