You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:15:03