Jak używać Rusta z Pythonem?

Zespół Sages
Ikona kalendarza
31 lipca 2024

Rust to nowoczesny język programowania, który oferuje wysoką wydajność, bezpieczeństwo pamięci i współbieżność. Python to popularny język skryptowy, który ułatwia szybkie prototypowanie, analizę danych i uczenie maszynowe. Jak połączyć te dwa języki i wykorzystać ich zalety?

W tym artykule pokażę Ci, jak używać Rusta z Pythonem, korzystając z narzędzi takich jak PyO3 i Maturin. PyO3 to biblioteka, która umożliwia tworzenie natywnych modułów Pythona w Rust. Maturin to narzędzie, które ułatwia budowanie, pakowanie i dystrybuowanie projektów mieszanych Python-Rust. Pokażemy ci, jak napisać prostą funkcję w Rust, która przyjmuje argumenty z Pythona i zwraca wynik do Pythona. Pokażę Ci też, jak zbudować i zainstalować swój moduł Rust jako pakiet Pythona, który możesz zaimportować i użyć w swoim kodzie Pythona.

Jak napisać funkcję w Rust, która przyjmuje argumenty z Pythona i zwraca wynik do Pythona

Aby napisać funkcję w Rust, która może być wywoływana z Pythona, musimy użyć makra #[pyfunction] z biblioteki PyO3. To makro automatycznie konwertuje argumenty i wartości zwracane między typami Rusta i Pythona. Na przykład, jeśli chcemy napisać funkcję, która dodaje dwie liczby całkowite i zwraca ich sumę, możemy to zrobić tak:

use pyo3::prelude::*;

#[pyfunction]
fn add(a: i32, b: i32) -> PyResult<i32> {
    Ok(a + b)
}

Jak widać, funkcja przyjmuje dwa argumenty typu i32, który jest typem całkowitym w Rust, i zwraca wynik typu PyResult<i32>, który jest typem wyniku z biblioteki PyO3. Typ PyResult<T> jest używany do obsługi błędów, które mogą wystąpić podczas konwersji typów lub wykonywania operacji. Jeśli wszystko pójdzie dobrze, funkcja zwraca wartość Ok(T), gdzie T jest wartością zwracaną. Jeśli coś pójdzie nie tak, funkcja zwraca wartość Err(E), gdzie E jest błędem. Aby udostępnić naszą funkcję Pythonowi, musimy zarejestrować ją w module Rust, który będzie naszym natywnym modułem Pythona. Aby to zrobić, musimy użyć makra #[pymodule] z biblioteki PyO3. To makro tworzy moduł Rust, który może być importowany i używany w Pythonie. Na przykład, jeśli chcemy nazwać nasz moduł rusty, możemy to zrobić tak:

use pyo3::prelude::*;

#[pymodule]
fn rusty(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(add, m)?)?;
    Ok(())
}

Jak widać, funkcja przyjmuje dwa argumenty: py, który jest referencją do interpretera Pythona, i m, który jest referencją do modułu Rust. Następnie używamy funkcji add_function, która dodaje naszą funkcję add do modułu Rust, używając makra wrap_pyfunction, które opakowuje naszą funkcję w obiekt Pythona. Na koniec zwracamy wartość Ok(()), która oznacza, że wszystko poszło dobrze. Teraz mamy gotową funkcję w Rust, która może być wywoływana z Pythona. Aby to sprawdzić, musimy zbudować i zainstalować nasz moduł Rust jako pakiet Pythona. Pokażę Ci, jak to zrobić w następnej części artykułu.

Jak zbudować i zainstalować moduł Rust jako pakiet Pythona

Aby zbudować i zainstalować nasz moduł Rust jako pakiet Pythona, będziemy potrzebować narzędzia o nazwie Maturin. Maturin to narzędzie, które ułatwia budowanie, pakowanie i dystrybuowanie projektów mieszanych Python-Rust. Maturin obsługuje zarówno systemy operacyjne Windows, Linux, jak i MacOS, a także różne wersje Pythona. Aby zainstalować Maturin, możemy użyć menedżera pakietów Pythona, pip. Wystarczy wpisać następujące polecenie w terminalu:

pip install maturin

Aby zbudować nasz moduł Rust jako pakiet Pythona, musimy utworzyć plik o nazwie Cargo.toml w katalogu naszego projektu. Plik Cargo.toml jest plikiem konfiguracyjnym dla narzędzia Cargo, które jest menedżerem zależności i budowania dla projektów Rust. W pliku Cargo.toml musimy podać podstawowe informacje o naszym projekcie, takie jak nazwa, wersja, autorzy, licencja, itp. Musimy także dodać zależność do biblioteki PyO3, która umożliwia tworzenie natywnych modułów Pythona w Rust. Na przykład, nasz plik Cargo.toml może wyglądać tak:

[package]
name = "rusty"
version = "0.1.0"
authors = ["Bing <bing@microsoft.com>"]
edition = "2018"
license = "MIT"

[dependencies]
pyo3 = { version = "0.14", features = ["extension-module"] }

Aby zbudować nasz moduł Rust jako pakiet Pythona, musimy użyć polecenia maturin build w terminalu. To polecenie automatycznie skompiluje nasz kod Rust i utworzy plik końcowy o nazwie rusty-0.1.0-cp39-cp39-win_amd64.whl (nazwa może się różnić w zależności od wersji Pythona i systemu operacyjnego). Plik .whljest plikiem binarnym, który zawiera nasz moduł Rust i wszystkie niezbędne metadane. Aby zainstalować nasz moduł Rust jako pakiet Pythona, musimy użyć polecenia pip install w terminalu. To polecenie automatycznie skopiuje nasz plik .whl do odpowiedniego katalogu i zarejestruje go w systemie Pythona. Na przykład, możemy zainstalować nasz moduł Rust tak:

pip install rusty-0.1.0-cp39-cp39-win_amd64.whl

Teraz mamy gotowy pakiet Pythona, który zawiera nasz moduł Rust. Aby go użyć, wystarczy zaimportować go w naszym kodzie Pythona i wywołać naszą funkcję add. Na przykład, możemy to zrobić tak:

import rusty

result = rusty.add(2, 3)
print(result)

To powinno wypisać 5 na ekranie. W ten sposób możemy używać Rusta z Pythonem, korzystając z PyO3 i Maturin. Możemy także tworzyć bardziej złożone funkcje i klasy w Rust, które mogą wchodzić w interakcje z typami i obiektami Pythona. Możemy także eksportować nasz pakiet Pythona do PyPI, aby udostępnić go innym użytkownikom Pythona.

Zostań ekspertem w języku Rust: Zapisz się na kompleksowe Szkolenie Rust

Mamy nadzieję, że ten artykuł był dla Ciebie pomocny i interesujący. Jeśli chcesz dowiedzieć się więcej o programowaniu w Rust lub potrzebujesz poznać najpierw podstawy tego języka, zapraszamy na nasze szkolenie Rust w formule otwartej lub zamkniętej - dostosowane do potrzeb Twoich projektów.

Przeczytaj także

Ikona kalendarza

29 marzec

To be or not to be a multi cloud company? Przewodnik dla kadry kierowniczej, doradców ds. chmury i architektów IT. (część 2)

Po przeczytaniu pierwszej części poradnika zauważymy, że strategie organizacji są różne. Część firm oparło swój biznes wyłącznie na j...

Ikona kalendarza

27 wrzesień

Sages wdraża system Omega-PSIR oraz System Oceny Pracowniczej w SGH

Wdrożenie Omega-PSIR i Systemu Oceny Pracowniczej w SGH. Sprawdź, jak nasze rozwiązania wspierają zarządzanie uczelnią i potencjałem ...

Ikona kalendarza

12 wrzesień

Playwright vs Cypress vs Selenium - czy warto postawić na nowe?

Playwright, Selenium czy Cypress? Odkryj kluczowe różnice i zalety każdego z tych narzędzi do automatyzacji testów aplikacji internet...