问题标签 [pyo3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
183 浏览

rust - 使用 pyo3 引发异常

如何正确引发异常?

我尝试了以下方法:

这与此处描述的实现方式完全相同。

当我创建一个Foo具有无效参数值的实例时,而不是ValueErroraSystemError引发错误文本<class 'Foo'> returned a result with an error set

我在 Linux 上每晚使用 pyo3 0.11.1 和 Rust 1.47.0。

0 投票
1 回答
316 浏览

python - PyO3 - 传递类扩展另一个类作为函数参数

我有一个 Rust 库,我希望能够从 Python 中使用它。所以我可以使用 PyO3 进行绑定。

假设我在 Rust 中有以下库:

该库的用户可以使用结构 Dog 和 Cat 以及函数 make_three_sounds。但他们也可以使用特性 Animal 定义自己的动物,然后将其传递给函数 make_three_sounds。

现在,假设我希望从 Python 中使用这个库。所以我可以使用 PyO3 来制作 Rust -> Python 绑定。然而,问题是在 Python 中,这会以不同的方式实现。您将拥有一个可以扩展的类,而不是 trait。所以在 Python 中,这个库看起来像这样:

为了创建一个 Dog 和 Cat 类,我只需要在 Dog 和 Cat 结构体上方使用“#[pyclass]”和“#[pymethods]”。问题在于创建一个可以扩展的 Animal 类,然后传递给函数 make_three_sounds。为了创建 Animal 类,我可以创建一个使用 Animal 特征的结构,然后在其上方添加“#[pyclass]”。

但问题是:当 Python 库的用户扩展该类(Animal)然后将其传递给 make_three_sounds 时,它将无法工作,因为 make_three_sounds 必须接受一个实现 trait Animal 的结构,而 Python 对象没有实现它特征(尽管它是扩展实现它的类/结构的类的对象)。我可以制作一个make_three_sounds接受 PyAny 对象的函数包装器,但是我以后如何将该对象传递给实际make_three_sounds函数?

0 投票
1 回答
94 浏览

python - 使用 PyAny 在 Python 中的 TypeError 在反射数字模拟器(例如 __radd__)中用于 Rust pyo3 pyclass 结构

我使用 pyo3 为 python 创建了一个 Rust 库。这包含一个 pyclass 结构,它实现了几个 PyNumberProtocol 方法,如__add__,__sub__等......以允许 + 和 - 等 python 运算符在该类上工作。我在其中大多数中使用 PyAny 作为“其他”对象,因为我想支持许多不同的类型。这工作正常,但是当我尝试实现和之类的反射方法时__radd____rsub__python 会抛出一个 TypeError。抛出的 TypeError 没有参数或消息,它只是一个空的 TypeError。如果我调用myitem.__radd__(other)other + myitem失败,该方法本身会起作用。我删除了除 i64 以外的所有__add__内容__radd__作为示例(下面的 TestClass1)。

我可以为特定类型实现反射方法,例如 i64(参见下面的 TestClass2)。但显然这不允许任何不同的类型(浮点数、列表、类等......)。我找不到任何可以工作的泛型类型,也找不到任何重载该方法的__radd__方法。所以我的问题是,有没有办法实现__radd__从 python 接受多种类型?我对 Rust 很陌生,所以我可能错过了一些明显的东西......

Rust 示例库:

Python 示例,除最后一行外,所有打印语句都按预期工作:

我正在使用 Rust 1.45.2、pyo3 0.11.1、python 3.7.3

0 投票
1 回答
266 浏览

rust - PyO3 构建的 rust 绑定可执行文件会导致导入错误?

我最近遇到了 PyO3,我已经成功地从PyO3 repo构建了示例代码。

货运.toml

库文件

该构建创建了两个文件libstring_sum.dlibstring_sum.so,然后我创建了一个测试 python 脚本并尝试使用构建这个 rust 绑定,import libstring_sum但它给出了这个错误

ImportError:动态模块没有定义模块导出函数(PyInit_libstring_sum)

0 投票
0 回答
65 浏览

python - Pyo3:为什么使用不正确的构造函数时不会抛出错误?

我正在使用 pyo3 编写一个带有 Rust 后端的 python 库,我不明白为什么当你调用错误的构造函数时没有抛出错误,我认为当我显示代码时我所说的会更有意义。

它编译得很好,但是当我使用错误的构造函数时,它不会引发任何错误。

0 投票
2 回答
464 浏览

rust - 如何使用 PyO3 在 Rust 中创建异构 Python 字典?

基于,我可以创建一个同质的 Python 字典。

如何创建具有混合类型值的字典,例如使其工作:

?

0 投票
1 回答
154 浏览

python - 需要外部库时使用 Maturin

我正在尝试从我正在制作的 Rust Crate 制作 Python 包。问题是我需要安装在系统中的RGSL crate libgsl0-dev

我正在尝试使用Maturin 发布,它使用 Manylinux Docker 映像为 Linux 构建一切。问题是图像没有libgsl0-dev安装,所以我做了一个自定义图像添加一行:

但是当我尝试构建时:

docker run --rm -v $(pwd):/io custom-image build --cargo-extra-args="--no-default-features"

⚠ 警告:您正在构建库而没有激活 pyo3 的 extension-module功能。请参阅 https://pyo3.rs/v0.12.4/building_and_distribution.html#linking 找到 pyo3 绑定 在 python3.6 找到 CPython 3.6m,在 python3.7 找到 CPython 3.7m,在 python3.8 找到 CPython 3.8,在 python3 找到 CPython 3.9。 9
编译 pyo3 v0.12.4 错误:找不到本机静态库 python3.6m,可能缺少 -L 标志

我在这里缺少什么?任何形式的帮助将非常感激

0 投票
1 回答
178 浏览

python - Rust Numpy 库 - 按行迭代:无法构建返回行而不是单个值的 NpySingleIterBuilder::readwrite

我正在尝试在 Numpy 数组上逐行迭代。该数组是通过 PyO3 访问的,我认为库对底层 C 对象的访问很好,但我似乎找不到更复杂的 SingleIteratorBuilder 的引用,它可以帮助我按行访问数组。

这是文档页面:https ://docs.rs/numpy/0.12.1/numpy/npyiter/struct.NpySingleIterBuilder.html#method.readwrite (我看到该项目仍处于起步阶段)

这是我在 rust 中的代码,它被编译成 python 模块

而这个案例的python代码......

这返回了我刚才所说的

当然,我尝试使用 ndarray 并将整个 pyArray 复制到一个新对象中,但这是最糟糕的情况,因为我的矩阵在行和列上都应该很大。复制数据可能是更糟糕的选择。

0 投票
1 回答
270 浏览

python - 在包含来自不同 crate 的类型的 rust 结构上使用 pyo3 pyclass

我有一个 rust 结构,它使用 pyo3 pyclass 宏来允许在 python 中使用。这适用于简单的结构,但如果我有一个包含来自不同库的类型的结构,它就会变得更加困难。

例子:

上面我们使用了 rust geo 库中的 Point 类型。编译器提供以下错误: the trait `pyo3::PyClass` is not implemented for `geo::Point<f64>

如果我然后尝试在 Point 上实现 PyClass:

它给了我以下编译器错误: impl doesn't use only types from inside the current crate

关于解决此问题的干净简单方法的任何想法?

0 投票
1 回答
322 浏览

python - 如何将 PyArray 转换为 Vec> 在锈

我正在使用 Rust 中的 numpy crate 来处理来自 python 的二维数组。PyArrayhttps://docs.rs/numpy/0.11.0/numpy/array/struct.PyArray.html)实现了一个from_vec2()函数,将 aVec<Vec<T>>转换为PyArray<T, 2>(2D PyArray),以及一个to_vec()函数,将 2D 数组扁平化为一维向量并返回Vec<T>,但它没有实现to_vec2()。有没有一种简单的方法来进行我缺少的这种转换,或者我必须手动实现这个功能?

谢谢。