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
相关产品推荐
相关产品推荐

