rumtk_python_exec_module

Macro rumtk_python_exec_module 

Source
macro_rules! rumtk_python_exec_module {
    ( $py:expr, $mod_path:expr) => { ... };
    ( $py:expr, $mod_path:expr, $func_name:expr ) => { ... };
    ( $py:expr, $mod_path:expr, $func_name:expr, $args:expr ) => { ... };
}
Expand description

Load a Python module and execute contents.

§Example

§Running the Module

    use std::fs::write;
    use pyo3::Python;
    use uuid::Uuid;
    use crate::rumtk_core::core::RUMResult;
    use crate::rumtk_core::rumtk_python_exec_module;

    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 result = Python::attach(|py| -> RUMResult<()> {
            rumtk_python_exec_module!(py, &module_fname);
            Ok(())
        });
        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::rumtk_python_exec_module;

    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 result = Python::attach(|py| -> RUMResult<()> {
            rumtk_python_exec_module!(py, &module_fname, "test");
            Ok(())
        });
        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;
    use crate::rumtk_core::rumtk_python_exec_module;

    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 result = Python::attach(|py| -> RUMResult<usize> {
            let result = rumtk_python_exec_module!(py, &module_fname, "test");
            let val: usize = py_extract_any(py, &result)?;
            Ok(val)
        });
        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};
    use crate::rumtk_core::rumtk_python_exec_module;

    fn test_module_exec() -> f64 {
        let a = 5;
        let b = 5.0;

        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 result = Python::attach(|py| -> RUMResult<f64> {
            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)
        });
        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!")