簡體   English   中英

如何使用 pyo3 從 Python 文件調用 Rust 函數?

[英]How to call a Rust function from a Python file using pyo3?

我正在開發一個視頻游戲,我需要在其中從 Python 文件設置 Rust 對象(例如,添加一個帶有texture:"", coords:"", text:"", action:""的按鈕texture:"", coords:"", text:"", action:"" )。

我正在使用 pyo3 crate 來鏈接 Python 和 Rust。 我成功地從我的 Rust 代碼調用 Python 腳本,但我找不到如何從 Python 文件調用 Rust 函數。

執行我的 Python 腳本的 Rust 代碼:

fn main() -> PyResult<()> {
    let gil = Python::acquire_gil();
    let py = gil.python();
    let script = fs::read_to_string("deep_hello.py")?;

    println!("RUNNING :\n[\n{}]", script);
    py.run(&script, None, None)
}

我想從我的 Python 腳本調用的 Rust 函數:

/// hello_from_rust(/)
/// --
///
/// This function prints hello because she is very nice.
#[pyfunction]
fn hello_from_rust() {
    println!("Hello from rust from python !");
}

我的 Python 腳本:

hello_from_rust()

我得到這個輸出:

RUNNING :
[
hello_from_rust()
]
Error: PyErr { type: Py(0x7f9cdd1e9580, PhantomData) }

如果我正確理解了您的問題,那么您嘗試執行的操作包括三個步驟:

  1. 創建一個包含函數hello_from_rust()的 Python 模塊
  2. 在 Python 腳本deep_hello.py使用它
  3. 在 Rust 中運行deep_hello.py

我無法完全重現您的問題,但問題的根源似乎在第一步或第二步。

使用 PyO3 定義 Python 模塊

PyO3 文檔中,我希望hello_from_rust()位於定義 Python 模塊的 Rust 文件中,該模塊如下所示:

use pyo3::prelude::*;
use pyo3::wrap_pyfunction;

#[pyfunction]
fn hello_from_rust() {
    println!("Hello from rust from python !");
}

#[pymodule]
fn hello_module(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_wrapped(wrap_pyfunction!(hello_from_rust));

    Ok(())
}

您可以使用 Cargo 將其構建到 Python 模塊中(請參閱此處;根據您的操作系統,說明略有不同)並將生成的.so (Linux 或 MacOS)或.pyd (Windows)文件放在與您的 Python 腳本相同的目錄中。

筆記

你必須創建一個類似於hello_module來初始化你的 Python 模塊。 如果不這樣做,您的 Rust 庫可能仍會編譯,但您將無法導入hello_from_rust

使用你的新 Python 模塊

您的deep_hello.py腳本應如下所示:

import hello_module
hello_module.hello_from_rust()

確保.so.pyd文件可在您的PYTHON_PATH訪問(例如,將其放在與腳本相同的目錄中),使用 Python >= 3.5 運行deep_hello.py應該可以工作。 (請注意,您的系統 Python 可能是 Python 2,因此您可能希望使用較新版本的 Python 創建一個 Anaconda 環境並在其中工作。)

對我來說,遵循這些步驟就成功了。

(ruspy) ruspy $ python deep_hello.py
Hello from rust from python !

筆記

確保你記得在你的 Python 腳本中import hello_module PyErr返回由您py.run(&script, None, None)使我懷疑這個問題實際上是在你的Python腳本,而事實上我希望hello_from_rust()沒有前from deep_hello import *產生NameError ,即使你正確地組合了你的deep_hello模塊。

從 Rust 從 Python 調用 Rust

我不完全確定您為什么要這樣做,但是您現在應該可以從 Rust 運行deep_hello.py

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM