从C++调用的Python函数中使用print为何会出现返回值异常?
C++嵌入Python调用含print逻辑函数返回异常原因分析
你遇到的现象本质是Python函数执行过程中触发了内部异常,导致PyObject_CallObject返回空指针,而PyLong_AsLong接收空指针输入时固定返回-1,和函数本身的返回值无关。
常见触发原因如下:
- 标准输出初始化缺失
C++嵌入Python时如果仅调用Py_Initialize()做基础初始化,未主动将sys.stdout、sys.stderr绑定到有效流,在非控制台程序、或者标准输出被重定向到无效句柄的场景下,执行print操作会直接抛出IO异常,中断函数执行返回空。去掉print后函数没有IO操作,自然可以正常执行返回结果。 - GIL持有状态错误
如果调用Python函数的C++代码运行在多线程环境下,调用前未主动获取GIL全局解释器锁,执行print这类涉及Python全局资源操作的逻辑时会触发运行时异常,导致调用失败。 - 参数字符串转换异常
你传入的token参数本身可以被业务逻辑正常处理,但print输出时会隐式调用参数对象的__str__方法,如果该方法实现存在问题、或者参数是不支持字符串序列化的类型,就会在执行print时抛出异常。
你可以在调用逻辑中加入异常检查代码定位具体原因:
PyObject* pyResult = PyObject_CallObject(pyMktUpdate, pyArgs); // 检查调用是否触发异常 if (pyResult == nullptr) { PyErr_Print(); // 输出Python端的完整异常栈到标准错误流 // 此处补充你的异常处理逻辑 } else { long res = PyLong_AsLong(pyResult); std::cout << "Output " << res << std::endl; Py_DECREF(pyResult); // 释放Python对象引用,避免内存泄漏 }
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

