Разговор с python с помощью Rust


Несколько слов о Rust

Rust — это язык системного программирования, который работает молниеносно быстро, предотвращает сегфаулты и гарантирует безопасность потоков.

Зачем писать модули Python на Rust?

Python, несомненно, является одним из самых мощных языков программирования, но бывают ситуации, когда требуется более быстрый и низкоуровневый инструмент. Например, вычисления, в которых мы заботимся о максимально быстром выполнении кода.

Начало работы


1. Установите Rust и Cargo

В системах Linux и macOS это делается следующим образом:

$ curl https://sh.rustup.rs -sSf | sh
Войдите в полноэкранный режим Выйдите из полноэкранного режима

В Windows загрузите и запустите rustup-init.exe. Он запустит установку в консоли и выдаст приведенное выше сообщение об успехе.

2. Создайте новый проект и отредактируйте Cargo.toml

$ cargo new pyrustlib --lib
Войдите в полноэкранный режим Выйдите из полноэкранного режима

В файл Cargo.toml необходимо добавить зависимость cpython, этот файл должен выглядеть следующим образом

[package]
name = "pyrustlib"
version = "0.1.0"
edition = "2021"

[lib]
name = "pyrust"
crate-type = ["dylib"]

[dependencies.cpython]
version = "0.7"
features = ["extension-module"]
Войти в полноэкранный режим Выйти из полноэкранного режима

Давайте поговорим с Python

Далее мы откроем src/lib.rs и начнем редактирование; именно здесь находится фактический код нашей библиотеки.


#[macro_use]
extern crate cpython;

use cpython::{Python, PyResult, PyString};

fn hello_from_rust(_py: Python) -> PyResult<PyString> {
    Ok(PyString::new(_py, "Hello from Rust!"))
}

py_module_initializer!(libpyrust, libpyrust, PyInit_libpyrust, |py, m | {
    m.add(py, "__doc__", "This module is implemented in Rust")?;
    m.add(py, "hello_world", py_fn!(py, hello_from_rust()))?;
    Ok(())
});
Войти в полноэкранный режим Выход из полноэкранного режима

py_module_initializer — это макрос, определенный cpython crate, который мы импортировали в начало нашей библиотеки. Первый параметр (‘status’) — это имя нашего модуля, второй параметр — это именование Python2 для нашего модуля, а третий параметр — для Python3. Последний сегмент кода в первой строке (py, m) позволяет модифицировать полученные объекты модуля.

Затем мы добавляем docstring и используем макрос py_fn! для создания Python-версии нашей функции. Вот и все! Сохраните и выйдите.

Компиляция кода

Убедитесь, что вы находитесь в корневом каталоге проекта (где находится файл Cargo.toml).
Выполните следующую команду для компиляции кода:

cargo build --release 
Войти в полноэкранный режим Выйти из полноэкранного режима

Если компиляция прошла успешно, вы увидите новый каталог target в основном каталоге проекта. Вы можете найти библиотеку в target/release, она называется pyrustlib.so.

Проверка в интерпретаторе python

Имя для импорта этого модуля в python — это имя, указанное в py_module_initializer, которое в моем случае libpyrust.

Как вы можете видеть, наш модуль работает правильно.

Дополнительная информация

Для более продвинутого использования cpython я рекомендую просмотреть репозиторий rust-cpython.

Заключение

Я очень надеюсь, что это руководство было вам в какой-то мере полезно! Если вы заметили какие-либо ошибки или неточности, пожалуйста, напишите мне. Я хочу пригласить вас на мой github, возможно, вы найдете что-то интересное. Спасибо за чтение!

Оцените статью
devanswers.ru
Добавить комментарий