gpt4 book ai didi

python - 如何使用 pyo3 从 Python 文件中调用 Rust 函数?

转载 作者:行者123 更新时间:2023-12-03 11:23:20 28 4
gpt4 key购买 nike

我正在开发一个视频游戏,我需要从 Python 文件中设置 Rust 对象(例如,添加一个带有 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) }

最佳答案

如果我正确理解了您的问题,那么您尝试执行的操作涉及三个步骤:

  • 创建一个包含函数 hello_from_rust() 的 Python 模块
  • 在 Python 脚本中使用它 deep_hello.py
  • 运行deep_hello.py从 Rust 内部。

  • 我无法完全重现您的问题,但您的问题的根源似乎可能在第一步或第二步。

    使用 PyO3 定义 Python 模块

    来自 PyO3 documentation , 我希望 hello_from_rust()在一个 Rust 文件中定义一个看起来像这样的 Python 模块:

    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 模块中(请参阅 here ;说明根据您的操作系统略有不同)并将生成的 .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 中访问(例如,将其放在与脚本相同的目录中),运行 deep_hello.py使用 Python >= 3.5 应该可以工作。 (请注意,您的系统 Python 可能是 Python 2,因此您可能希望使用较新版本的 Python 创建 Anaconda 环境并在其中工作。)

    对我来说,遵循这些步骤就可以了。

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

    笔记

    请务必记住 import hello_module在你的 Python 脚本中! PyErr由您的 py.run(&script, None, None) 返回让我想知道问题是否真的出在你的 Python 脚本中,我确实希望 hello_from_rust()没有前面的 from deep_hello import *制作 NameError ,即使您将 deep_hello 放在一起模块正确。

    从 Rust 从 Python 调用 Rust

    我不完全确定您为什么要这样做,但您现在应该能够运行 deep_hello.py来自 rust 。

    关于python - 如何使用 pyo3 从 Python 文件中调用 Rust 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56803942/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com