【问题标题】:Can not create rust library for python无法为 python 创建 rust 库
【发布时间】:2022-01-11 05:45:52
【问题描述】:

我正在尝试用 rust 制作一个 python 模块。我仍然无法获取我需要生成的文件。我几乎完全按照本教程进行操作。

https://mycognosist.github.io/tutorial-rust-python-lib.html

这是我的 toml 文件。

name = "pylib"
version = "0.1.0"
authors = ["Atops"]
edition = "2018"

[lib]
name = "status"
crate-type = ["cdylib"]

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies.cpython]
version = "0.5"
features = ["extension-module"]

这是 lib.rs 的代码

extern crate cpython;

use cpython::{PyResult, Python, py_fn, py_module_initializer};

pub extern fn hello(_py: Python, val: String) -> PyResult<String> {
    match &*val {
        "hello" => Ok("world".to_string()),
        _ => Ok("afdfs".to_string()),
    }
}

py_module_initializer!(status, initstatus, Pyinit_status, |py, m|{
    m.add(py, "__doc__", "asdhgdfs")?;
    m.add(py, "hello", py_fn!(py, hello(val: String)))?;
    Ok(())
});

我使用 cargo.toml 文件导航到相应的文件夹,并使用教程中指定的 cargo build --release。它以一些关于某些事情“不是 FFI 安全”的警告结束。当它完成时,会创建一个名为“target”的新文件夹。我通过那里找到了库文件应该在哪里,但似乎没有生成适当的文件。我有这些。

target\release

这些对我来说似乎不可用。我不确定我做错了什么。

我将这些文件中的每一个都复制到了另一个文件夹中,并尝试在 python 中导入它们。这没有用。我尝试将它们更改为 .so 文件,但这不起作用。 windows应该在这里输出一个dll,但是尝试导入时dll文件不起作用。它不能用作 dll 文件或 so 文件。我不确定在这里做什么。此外,似乎在我看到的所有其他教程或指南中生成这些文件时,每个文件的名称上都有一个“lib”前缀。我没有得到这样的前缀。

【问题讨论】:

  • 您很好地告诉我们您是如何到达现在的位置,但您忘记告诉我们您是如何尝试使用这些库的(以及您是如何决定它们不可用的)错误,您需要.so 文件而不是.dll 文件吗?他们做错了吗?不要专注于回答我的问题,专注于用你自己的话描述你遇到的问题。
  • @EdwinBuck 我已经编辑了这个问题,以便更清楚地说明这一点。
  • 也许您应该关注this page,这似乎比您找到的教程更新得多。

标签: rust rust-cargo


【解决方案1】:

dll 文件包含 COFF 系统(如 Windows)的共享对象代码,而 so 文件通常包含 ELF(和其他)系统(如 Linux)的共享对象代码。

重命名它们在任何情况下都不起作用。如果您有一个并且需要另一个,则需要在正确、匹配的操作系统上重建它们。

我认为您可能会在 Windows 机器上遵循 Linux 的说明(由于 lib 前缀),然后期望某些说明能够正常工作。如果您可以识别平台之间的所有“更改”并修改 Linux 指令以匹配 Windows 平台,它们可能会起作用;但在您知道如何将一个环境的指令转换为另一个环境之前,如果您只找到一组仅引用 dll 文件而不提及 so 文件的 Windows 指令,可能会更容易。

【讨论】:

  • 链接的教程似乎不是特定于 Linux 的,但它已经四年了,这在 Rust 和 Python 时代是相当多的。 (例如,它使用 Python 2.7。)
  • @user4815162342 感谢您让我阅读本教程。我不得不为圣诞节挂灯。您为什么不发布一个答案,说明他们的教程很旧,并且使用您在 cmets 中提供的教程可能会更好地为他们服务?之后我很乐意在黑暗中删除这张照片,并很乐意支持你的解决方案!
  • 不客气。 :) 我没有发布答案,因为我希望答案至少包含一些权威信息。由于我从未使用过任何 PythonRust 绑定,也没有在 Windows 上使用过 Rust,所以我只能推测,这对于 cmets 来说比对于答案更合适。
猜你喜欢
  • 2021-01-03
  • 2019-03-26
  • 1970-01-01
  • 2017-01-02
  • 2021-01-11
  • 2020-11-11
  • 1970-01-01
  • 2022-09-25
  • 2014-06-16
相关资源
最近更新 更多