Chiamare codice Python in Rust con PyO3

Mattepuffo's logo
Chiamare codice Python in Rust con PyO3

Chiamare codice Python in Rust con PyO3

PyO3 è un crate per Rust che, tra le altre cose, ci consente di avviare codice Python con Rust.

Questo può essere molto comodo anche per creare bindings su librerie per Python che non hanno versioni per altri linguaggi.

In questo articolo vediamo un esempio basico.

Partiamo dalle dipendenze generali; su Ubuntu c'è scritto di installare questo pacchetto:

$ sudo apt install python3-dev

Su Arch Linux e affini:

# pacman -S base-devel

Poi queste le dipendenze che ho installato in Cargo:

[dependencies]
pyo3 = { version = "0.28.2", features = ["auto-initialize", "abi3-py310"] }

Qui sotto un pò di codice in cui richiamiamo una libreria di sistema:

use pyo3::prelude::*;
use pyo3::types::IntoPyDict;

fn main() -> PyResult<()> {
    Python::attach(|py| {
        let sys = py.import("sys")?;
        let version: String = sys.getattr("version")?.extract()?;

        let locals = [("os", py.import("os")?)].into_py_dict(py)?;
        let code = c"os.getenv('USER') or os.getenv('USERNAME') or 'Unknown'";
        let user: String = py.eval(code, None, Some(&locals))?.extract()?;

        println!("Hello {}, I'm Python {}", user, version);
        Ok(())
    })
}

Volendo potete richiamare anche libreria aggiuntive; in questo caso:

  • o le installate a livello di sistema
  • o usate il virtualenv, ma prima di lanciare la build dovete attivarlo

Può essere che a seconda della distro o OS, ci siano altri pacchetti da installare o configurazione da fare.

Enjoy!


Condividi

Commentami!