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

12 sierpień

Event-Driven Architecture: co to jest i dlaczego warto ją wdrożyć w organizacji

Event-Driven Architecture (EDA) to nowoczesne podejście do projektowania systemów IT. Dowiedz się, jak EDA może wpłynąć na rozwój Two...

Ikona kalendarza

8 sierpień

User Experience Design - nowy kierunek studiów podyplomowych Sages i ALK

Rozpocznij karierę jako UX Designer! Nasze studia podyplomowe UX oferują kompleksowe zrozumienie podstaw i kluczowych aspektów projek...

Ikona kalendarza

29 lipiec

Omega-PSIR certyfikowanym dostawcą usług ORCID

Oprogramowanie Omega-PSIR, rozwijane przez Instytut Informatyki Politechniki Warszawskiej we współpracy z Sages, ponownie otrzymało a...