c++调用python脚本报错returned a result with an error set

c++调用python脚本报错

  • 问题描述
  • 解决方法
    • 更新
  • 感想
  • 参考资料

问题描述

在这里插入图片描述

在QT中调用python脚本时,使用了这三个函数:
PyImport_ImportModule
PyObject_GetAttrString
PyObject_CallObject

报错

Exception ignored in: <module 'threading' from 'D:\\Program Files (x86)\\Anaconda\\envs\\python32\\lib\\threading.py'>
Traceback (most recent call last):
  File "D:\Program Files (x86)\Anaconda\envs\python32\lib\threading.py", line 1289, in _shutdown
    assert tlock.locked()    
SystemError: <built-in method locked of _thread.lock object at 0x276EA800> returned a result with an error set
      finish the work and sent the resultReady signal

解决方法

  • 开辟新线程,将python脚本的调用放到新线程中执行
  • 检查python脚本中的文件路径是否正确
  • 检查python脚本中是否使用了if __name__=="__main__",因为c++调用的是函数,所以要把if __name__=="__main__改为def main():,即自己写一个主函数
    然后PyObject* pFun= PyObject_GetAttrString(pModule,"main");
  • 用VS的话,先生成exe可执行文件,然后进入Debug文件夹,通过点击运行exe文件,而不是通过VS调试模式F5,去调用py文件。(注意C++代码中导入py文件的路径不要搞错)

更新

最后发现开启一个新线程这种方法也挺多坑的,最后我采用的是开启一个cmd进程,然后再在cmd中调用Python脚本的方法。具体可以参考这篇博客.

感想

为这个bug花了一个下午的时间,网络上的相关资料也比较少。遇到bug时要先仔细审时自己的代码,然后再去网上找资料。

参考资料

调用Python时出现Exception ignored in: module ‘threading’ from ‘xxx:\Anaconda3\Lib\threading.py’

你可能感兴趣的:(C++,c++,python,bug)