问题标签 [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.
rust - 使用 pyo3 引发异常
如何正确引发异常?
我尝试了以下方法:
这与此处描述的实现方式完全相同。
当我创建一个Foo
具有无效参数值的实例时,而不是ValueError
aSystemError
引发错误文本<class 'Foo'> returned a result with an error set
。
我在 Linux 上每晚使用 pyo3 0.11.1 和 Rust 1.47.0。
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
函数?
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
rust - PyO3 构建的 rust 绑定可执行文件会导致导入错误?
我最近遇到了 PyO3,我已经成功地从PyO3 repo构建了示例代码。
货运.toml
库文件
该构建创建了两个文件libstring_sum.d和libstring_sum.so,然后我创建了一个测试 python 脚本并尝试使用构建这个 rust 绑定,import libstring_sum
但它给出了这个错误
ImportError:动态模块没有定义模块导出函数(PyInit_libstring_sum)
python - Pyo3:为什么使用不正确的构造函数时不会抛出错误?
我正在使用 pyo3 编写一个带有 Rust 后端的 python 库,我不明白为什么当你调用错误的构造函数时没有抛出错误,我认为当我显示代码时我所说的会更有意义。
它编译得很好,但是当我使用错误的构造函数时,它不会引发任何错误。
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 标志
我在这里缺少什么?任何形式的帮助将非常感激
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 复制到一个新对象中,但这是最糟糕的情况,因为我的矩阵在行和列上都应该很大。复制数据可能是更糟糕的选择。
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
关于解决此问题的干净简单方法的任何想法?
python - 如何将 PyArray 转换为 Vec> 在锈
我正在使用 Rust 中的 numpy crate 来处理来自 python 的二维数组。PyArray
(https://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()
。有没有一种简单的方法来进行我缺少的这种转换,或者我必须手动实现这个功能?
谢谢。