问题描述
在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’