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.