C++调用Python脚本进行18次循环操作后,脚本不执行

C++调用python,并且在python和C++之间传输数据(numpy和mat数据) C++调用PythonC++调用Python官方文档准备工作环境搭建调用方法包含头文件以及链接到库直接调用简单语句简单函数调用Mat数据转PyObjectC++中解析python脚本返回的元组数据参考文档 C++调用Python 在毕业设计中需要用到一个深度学习网络的已有算法,但是整个框架是用C++写的,所以需要用C++调用Python,整个过程持续了一周,难受~ 但也学到了不少,在这里记录一下... 阅读详情

C++调用Python脚本进行18次循环操作后,脚本不执行

现象:

发送端接收端
请添加图片描述请添加图片描述

从第二张图中可以看出,python脚本卡在’[parkin_debug] 6’与’[parkin_debug] 7’之间
该测试经过多次反复测试,均在第18次循环执行时,出现上述问题

解决办法

在python解释器初始化位置加入以下多线程支持

PyEval_InitThreads();   //开启多线程支持
int nInit = PyEval_ThreadsInitialized();    //检测线程支持是否开启成功
if (nInit){
    PyEval_SaveThread();    //因为调用PyEval_InitThreads成功后,当前线程就拥有了GIL,释放当前线程的GIL。
}

在调用python脚本前加入以下代码

int nHold = PyGILState_Check() ;   //检测当前线程是否拥有GIL
PyGILState_STATE gstate;
if (!nHold){
    gstate = PyGILState_Ensure();   //如果没有GIL,则申请获取GIL
}
Py_BEGIN_ALLOW_THREADS;
Py_BLOCK_THREADS;

在调用python脚本后加入以下代码

Py_UNBLOCK_THREADS;
Py_END_ALLOW_THREADS;
if (!nHold) {
    PyGILState_Release(gstate);    //释放当前线程的GIL
}

问题分析

我使用C++调用python脚本的方式

//=================== 在main.cpp中初始化解释器 ===================
wchar_t *program = Py_DecodeLocale("parkin_python", NULL);
if (program == NULL) {
    fprintf(stderr, "Py_DecodeLocale fail\n");
    return -1;
}
Py_SetProgramName(program);
Py_Initialize();    //初始化Python环境
if ( !Py_IsInitialized()) { //检测是否初始化成功
    return -2;
}

//=================== 在**.cpp中调用python脚本 ===================
... python模块、函数和函数参数 初始化
PyObject* ret_py_final_estimates = PyObject_CallObject(pyfun_algorithm_mlem, args);
... python模块、函数和函数参数 释放

通过检索以下参考链接,尝试以下方式,发现可行,具体问题还在调研中。。。

C++调用Python脚本还可以通过QProcess调用,而通过管道进行数据传输。

参考链接

C++ 多线程调用Python脚本
记用C++调用Python函数时遇到的一个死锁
C++子线程中调用python代码

matplotlib_cpp被c++调用,应该怎么写cmakelist.txt--ubuntu16中默认python3为python3.5,ubuntu18中默认python3为python3.6 这段代码是一个CMake脚本的一部分,用于配置和准备一个C++项目,使其能够使用Python和Numpy库,以及一个名为的接口库。:这部分指定了Python 3.6版本的头文件和库文件的位置。是Python的头文件目录,是Python的库文件位置,是Python可执行文件的路径。:这里指定了Numpy的头文件目录和Numpy相关的库文件。这是因为Numpy通常和Python结合使用,特别是在需要进行数值计算时。 阅读详情

相关推荐

Qt5.14 C++ 调用 Python脚本(ubuntu18.0)

Qt5.14 + Ubuntu18.04 + anaconda3 + python3.9

weixin_43712556的博客 1056

【C++调用python问题记录】禁止显示状态错误 C4996 ‘PyEval_CallObjectWithKeywords‘: deprecated in 3.9 PythonCpp

VS调用python 小白遇到了问题

qq_45743549的博客 2846

python调用C++代码-方法-使用Pybind11库将C++代码与Python绑定

通过这个详细的步骤,你可以将C++代码与Python成功绑定。这种方法不仅适用于简单的函数绑定,也可以扩展到更复杂的C++类和模块,使得Python能够利用C++的强大性能。

像风一样自由的博客 1952

C++调用Python(傻瓜式教学)

用到的工具: 此处代码不太符合个人编码习惯,故稍加修改,修改后图如下: 检测代码是否能够运行: 配置Python的lib库 在本项目文件夹下新建python脚本文件,脚本内代码如下: 1.4.2 修改代码 1.4.3 运行 发生报错: 报错语句如下: 原因分析: VS认为我们用打开文件不安全,让我们采用。我们可以在项目中配置忽略这条报错即可。 继续运行 2.2 调用无参无返回值的函数

林仔520的博客 6602

C++ 调用Python

本文介绍了如何在 C++ 中调用 Python 脚本,并以一个实际应用案例演示了该方法的使用。boost.python 库提供了 C++ 与 Python 之间的转换接口,使得两种语言可以相互调用和传递参数。在 C++ 中调用 Python,需要使用 boost.python 库提供的相应接口。boost.python 是一个开源的库,提供了 C++ 与 Python 之间的转换接口,因此可以使用该库来在 C++ 中调用 Python 脚本。首先定义一个函数,用于调用 Python 脚本并传递参数。

. 799

《iOS之一起进大厂》系列-秒杀面试官的RunLoop底层原理面试题

Runloop是iOS面试中的必考题,不管大厂小厂都会问到。 这里包括了Runloop几乎所有的面试题,还有中肯完整的答案解释。

空杯子 1152

[已解决-最实用]Qt多次(多线程)调用python代码只能运行一次,调用全局解释锁GIL时造成的Fatal Python error: PyEval_SaveThread: NULL 等问题。

第三坑:初始化函数InitPy()最好是在构造函数中随程序生成之初就将python解释器初始化。但是一定要保存类名和构造函数的名一样,这里Qt中会提示。初始化解释器时在你的代码中只能被调用一次,因此避免除了初始化函数别的地方也出现。这样的代码,我也没办法解释,估计是加上以后提前将 PyObject这些对象销毁后线程中仍然有阻塞。都是对全局解释器锁GIL和线程的相关操作用类封装。会导致的程序崩溃问题,以及错误提示。就是在多次调用Python脚本会遇到程序崩溃的问题。问题:参考了很多博主的帖子,想要实现。

m0_73450520的博客 2615

【GESP】C++四级考试大纲知识点梳理, (10) 文件读写和重定向

其实,由于本人也是边学、边实验、边总结,且对考纲深度和广度的把握属于个人理解。因此本文更多的不是一个教程,而是个人知识梳理,如有遗漏、疏忽,欢迎指正、交流。孩子放假,出游一周,没有更新。刚刚归来,继续学习。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。(10)掌握文件操作中的重定向,实现文件读写操作,了解文本文件的分类,掌握写操作、读操作、读写操作。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。孩子放假,出游一周,没有更新。

CoderCoding的博客 525

记QT混编c++多次调用python脚本所出现的问题

刚开始在vs2019里做的时候为了省事,直接利用利用Py_Main去在系统终端里利用python xx.py这个命令,去外部执行这个代码,完了在代码中调用它输出的结果就好。 int py_init(void) { Py_SetPythonHome(const_cast<wchar_t *>(L"D:\\CYD\\miniconda3")); return 0; } int py_exec(wchar_t* script) { wchar_t* argv[2]; .

t15281180631的博客 3913

MatLab Desired port was :31515解决方案

前言:使用的MatLabR2022b今天突然出现了错误,在程序中打不开文件。后尝试了下面的方法,可以解决。后面还有另一种方法,上面方法如果行不通,大家可以尝试一下。搜索栏输入:firewall.cpl。找到相关项,右键属性,设置为允许。

qq_42212501的博客 1339

Ego Planner规划算法(下)——Ego Planner程序框架

本系列文章用于学习记录Ego-Planner规划算法的相关内容,本系列文章是在在Fast Planner规划算法系列文章的基础上,展开对Ego Planner的相关介绍,主要包括Ego Planner算法流程和程序框架两部分,主要学习资料是深蓝学院的移动机器人运动规划课程

慕羽★的博客 7259

C++与Python相互调用

概述 C++与Python相互调用,为什么要做这个功能呢,是因为C++的api接口库相对较少,python的api接口库比较丰富。 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,本人的系统环境是ubuntu18.04。 python2.7,C++与Python相互调用 这里直接从网上拷贝别人的内容,个人觉得写的非常好。 一、Python调用C/C++ 1、Python调用C动态链接库 Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调

AI人工智能的海洋 1581

第十届MathorCup高校数学建模挑战赛-B题:养老服务床位需求预测与运营模式研究

当养老床位数增加时存在的商机,提出了相应的养老服务床位的运营商业模式。就业的可能性,建立多目标规划模型,尽可能同时满足三方面的要求。务床位的需求、制定合理的养老服务床位发展规划,是构建和谐社会、幸福社会。问题一的床位需求与市场类型的分类结果,查找关于国内养老院的相关数据,探。求,又能持续发展养老事业,同时还能促进社会就业的养老服务床位运营的商业。养老服务床位数的增加能够带来的就业方面因素的影响,并对这些因素进行一个。你们的模型及其结论为科学依据,对政府管理部门针对养老床位规划提出合理的。

getusushu的博客 1139

QT下调用py脚本的两种方法

实现在c++QT中调用py脚本的两种方法

New_codeline的博客 7073

【python】懂车帝字体反爬逐层解密案例(附完整代码)

懂车帝字体反爬解密,完整代码分享

景天科技苑 2万+

多物理场耦合仿真-主题032-电磁-流体耦合

电磁-流体耦合,即磁流体动力学(MHD, Magnetohydrodynamics),是研究导电流体在电磁场中运动规律的学科,涉及电磁场与流体力学的深度耦合。本主题系统阐述磁流体动力学的基本理论、控制方程和数值方法。首先介绍MHD的基本概念和物理基础,包括导电流体的性质、电磁场基本方程;然后详细推导MHD控制方程组,包括连续性方程、动量方程、能量方程和电磁场方程;接着讨论MHD流动的特征参数,如Hartmann数、磁雷诺数、相互作用参数等;最后通过六个典型工程案例展示MHD分析的实际应用,包括电磁泵、磁流体

2401_87715305的博客 424

c/c++调用python

环境: Ubuntu18.04 实验Python: 系统自带的python和conda创建的python环境gymlab(python3.6) gcc版本 5.0 目标: 通过gcc编译c++(包含python) 一. C++结合系统自带python c++代码 // 运行命令 // g++ -I /usr/include/python3.6 main.cpp // -L /usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/ -l python3.6 #in.

406156440的博客 2752

Docker:安装Apache Pulsar 消息队列的详细指南

本文详细介绍了Apache Pulsar的Docker化安装部署方法,包括单节点Pulsar服务和管理界面Pulsar Manager的安装配置。通过Docker命令快速搭建Pulsar环境,并演示了租户和命名空间的基础管理操作。同时提供了Spring Boot项目与Pulsar集成的完整方案,从依赖配置到客户端初始化,为开发人员构建实时消息系统提供实用参考。

木头 2209

C++调用python脚本

C++调用python实现方式

柏灿的博客 312

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Ubuntu下Python与C/C++混合编程(简单调用)

说明:测试环境为ubuntu18.04,使用语言Python3,C++. 由于python中无法定义(short)类型,或者(int)类型,所以使用Python调用C++的方法,在C++中计算,然后用Python调用. C++调用Python Python模块代码: #!/usr/bin/python #Filename:TestModule.py def Hello(s): print "Hello World" print s def Add(a, b): print 'a='

如有侵权,请联系作者删除 2087

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Python调用C/C++入门

1. 背景 最近公司在某券商募集了一笔资金,需要对接其提供的程序化接口方便以后进行交易,对方只提供了c++版本程序,我们系统是python开发的,所以需要用python调用c++,大致了解下了python调用c++的几种方式,下面根据网上的资料介绍下几种方式优缺点,最后给个mac环境下python调用c++的例子。 2. Python调用C/C++程序方法 ctypes 如果是 C 函数库,...

卤蛋爱编程 1314

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【python】C++选手的python学习笔记

这篇博客是C++选手看“黑马程序员python教程”的学习笔记,供自己复习用。由于博主学过了C++,因此部分学习过程的内容会跳过。后面(应该)会不定期更新写Python代码时遇到的Python语法和函数。个人感觉Python和C++的最大区别是容器的不同。掌握了Python中容器的用法,特别是列表List的用法,对于C++选手来说就基本能使用Python了。

weixin_49119476的博客 2056

C,C++代码中调用python脚本

def hello(): print"hello,world!"   今天在开例会的时候,提到其他小组要做一个通用任务系统,会涉及到C++调用其他语言脚本开发的逻辑。之前倒是听互娱那边的同事说过,他们都是嵌入lua来进行脚本编程,但自己从来没试过

某花 1470

Qt C++调用Python方法以及类(类的实例化、成员函数调用

Qt C++调用Python方法以及类(类的实例化、成员函数调用前言环境配置参数传递调用Python方法调用Python类合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表F...

qq1512165940的博客 5306

基于pybind11的python调用c++模块

基于ubuntu 18.04系统,使用python3调用c++生成的动态链接库 1. pybind11的三种安装方式: (1) 命令安装 sudo apt-get install python-pybind11 (2) pip命令安装 pip3 install pybind11 (3) 源码编译安装 pip3 install pytest git clone https://github.com/pybind/pybind11.git cd pybind11 mkdir build cd buil

zouzoupaopao229的专栏 3782

python调用C++程序

python调用C++程序

hongwei的博客 2341
上一篇: C++调用Python3.7脚本常见问题
下一篇: 阅读文献的心得
returningprodigal
博客等级 码龄12年 53粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值