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

PyO3调用Python文件函数异常:仅执行文件未触发目标函数

问题描述

我使用PyO3官方示例代码,Rust代码如下:

Python::with_gil(|py| -> PyResult<Py<PyAny>> {
    let py_app = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/app.py"));
    let app: Py<PyAny> = PyModule::from_code(py, py_app, "", "")?
        .getattr("test_function")?
        .into();
    app.call0(py)
})

本地app.py内容如下(其中导入了Rust模块):

import GQLwrapper
    
print("running app.py")
def test_function:
    print("running test function")

执行Rust调用时,仅打印了"running app.py",但test_function函数并未被调用,请问这是什么原因?

问题原因及解决办法
  • Python函数定义语法错误:app.py中test_function的定义缺少括号,正确的函数定义必须包含括号(即使无参数):

    def test_function():
        print("running test function")
    

    这个语法错误会导致Python解释器解析模块时中断,函数无法被正确定义,Rust代码虽然能加载模块并执行到print语句,但无法获取到有效的test_function对象,自然无法触发调用。

  • 补充错误处理建议:当前Rust代码未显式处理PyResult的错误,建议添加错误捕获逻辑,便于排查问题:

    match Python::with_gil(|py| -> PyResult<Py<PyAny>> {
        let py_app = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/app.py"));
        let app: Py<PyAny> = PyModule::from_code(py, py_app, "", "")?
            .getattr("test_function")?
            .into();
        app.call0(py)
    }) {
        Ok(_) => println!("调用成功"),
        Err(e) => println!("调用出错: {}", e),
    }
    

    这样如果存在语法错误或其他异常,会直接打印错误信息,快速定位问题。

  • 模块导入验证:确认GQLwrapper模块能正常导入,若该模块加载失败也可能影响后续代码执行,但从当前现象判断,核心问题是函数定义的语法错误。

内容的提问来源于stack exchange,提问作者Happy Machine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:45:32