0

I'm trying to do a simple task of handling a Python class in Rust. Instantiate it, do an operation and than access one of its members. I extensively looked at PyO3 and cpython documentation and they cover a lot of the opposite (calling Rust from Python).

Why in the code below the application cannot find the attributes?

Python side:

class Vehicle:
    def __init__(self) -> None:
        self.speed = 0

    def increase(self):
        self.speed += 1
    
    def get_speed(self):
        return self.speed

Rust side:

extern crate pyo3;    
use pyo3::prelude::*;

fn main()  -> PyResult<()> {
    pyo3::prepare_freethreaded_python();
    
    Python::with_gil(|py| {
        let builtins = PyModule::import(py, "vehicle")?;
        builtins.getattr("increase")?.call0()?;
        println!("{}", builtins.getattr("get_speed")?.call0()?);
        Ok(())
    })
}

I'm following PyO3 documentation and here is the output:

Error: PyErr { type: <class 'AttributeError'>, value: AttributeError("module 'vehicle' has no attribute 'increase'"), traceback: None }
error: process didn't exit successfully: `target\debug\test_ffi.exe` (exit code: 1)

The expected output would be:

1

1 Answer 1

3

builtins contains the vehicle module. You need to retrieve the Vehicle class and instantiate it:

Python::with_gil(|py| {
    let builtins = PyModule::import(py, "vehicle")?;
    let vehicle = builtins.getattr("Vehicle")?.call0()?;
    vehicle.getattr("increase")?.call0()?;
    println!("{}", vehicle.getattr("get_speed")?.call0()?);
    Ok(())
})
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.