rumtk_python_exec

Macro rumtk_python_exec 

Source
macro_rules! rumtk_python_exec {
    ( $closure:expr ) => { ... };
}
Expand description

Execute the contents of a closure passed to this macro. This macro is an alias for [crate::rumtk_core::scripting::python_utils::py_exec].

See the blurp about that function to learn more!

§Closure Format

§Without Return

    |py: RUMPython| {
        rumtk_python_exec_module!(py, "module/path");
    };

§With Return

    |py: RUMPython| -> usize {
        let result = rumtk_python_exec_module!(py, "module/path", "my_python_function");
        let val: usize = py_extract_any(py, &result)?;
        val
    };

§Example

§Running the Module

    use std::fs::write;
    use pyo3::Python;
    use uuid::Uuid;
    use crate::rumtk_core::scripting::python_utils::RUMPython;
    use crate::rumtk_core::core::RUMResult;
    use crate::rumtk_core::{rumtk_python_exec_module, rumtk_python_exec};

    fn test_module_exec() {
        let module_fname = format!("{}_module.py", Uuid::new_v4());
        let module_contents = "print(\"Hello World!\")";
        write(&module_fname, module_contents).expect("Failed to write file!");

        let closure = |py: RUMPython| -> RUMResult<()> {
            rumtk_python_exec_module!(py, &module_fname);
            Ok(())
        };

        let result = rumtk_python_exec!(closure);
        std::fs::remove_file(&module_fname).unwrap();
    }

    test_module_exec()

§Running A Function

    use std::fs::write;
    use pyo3::Python;
    use uuid::Uuid;
    use crate::rumtk_core::core::RUMResult;
    use crate::rumtk_core::scripting::python_utils::RUMPython;
    use crate::rumtk_core::{rumtk_python_exec_module, rumtk_python_exec};

    fn test_module_exec() {
        let module_fname = format!("{}_module.py", Uuid::new_v4());
        let module_contents = "def test():\n\tprint(\"Hello World!\")";
        write(&module_fname, module_contents).expect("Failed to write file!");

        let closure = |py: RUMPython| -> RUMResult<()> {
            rumtk_python_exec_module!(py, &module_fname, "test");
            Ok(())
        };

        let result = rumtk_python_exec!(closure);
        std::fs::remove_file(&module_fname).unwrap();

    }

    test_module_exec()

§Running A Function With Result

    use std::fs::write;
    use pyo3::Python;
    use uuid::Uuid;
    use crate::rumtk_core::core::RUMResult;
    use crate::rumtk_core::scripting::python_utils::{py_extract_any, RUMPython};
    use crate::rumtk_core::{rumtk_python_exec_module, rumtk_python_exec};

    fn test_module_exec() -> usize {
        let module_fname = format!("{}_module.py", Uuid::new_v4());
        let module_contents = "def test():\n\treturn 5+5";
        write(&module_fname, module_contents).expect("Failed to write file!");

        let closure = |py: RUMPython| -> RUMResult<usize> {
            let result = rumtk_python_exec_module!(py, &module_fname, "test");
            let val: usize = py_extract_any(py, &result)?;
            Ok(val)
        };

        let result = rumtk_python_exec!(closure);
        std::fs::remove_file(&module_fname).unwrap();

        result.unwrap()
    }

    let result = test_module_exec();

    assert_eq!(10, result, "Bad value returned from Python snippet!")

§Running A Function With Arguments and Result

    use std::fs::write;
    use pyo3::Python;
    use uuid::Uuid;
    use crate::rumtk_core::core::RUMResult;
    use crate::rumtk_core::scripting::python_utils::{py_extract_any, py_new_args, py_push_arg, RUMPython};
    use crate::rumtk_core::{rumtk_python_exec, rumtk_python_exec_module};

    fn test_module_exec() -> f64 {
        let module_fname = format!("{}_module.py", Uuid::new_v4());
        let module_contents = "def test(a,b):\n\treturn a+b";
        write(&module_fname, module_contents).expect("Failed to write file!");

        let closure = |py: RUMPython| -> RUMResult<f64> {
            let a = 5;
            let b = 5.0;

            let mut args = py_new_args(py);
            py_push_arg(py, &mut args, &a);
            py_push_arg(py, &mut args, &b);

            let result = rumtk_python_exec_module!(py, &module_fname, "test", &args);
            let val: f64 = py_extract_any(py, &result)?;
            Ok(val)
        };

        let result = rumtk_python_exec!(closure);
        std::fs::remove_file(&module_fname).unwrap();

        result.unwrap()
    }

    let result = test_module_exec();

    assert_eq!(10.0, result, "Bad value returned from Python snippet!")