- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为我的库编写一个 Rust 后端,我需要在 pyo3
中实现与以下函数等效的功能:
def f(x):
return x
这应该返回与输入相同的对象,并且获取返回值的函数应该持有对输入的新引用。如果我在 C API 中编写它,我会把它写成:
PyObject * f(PyObject * x) {
Py_XINCREF(x);
return x;
}
在PyO3 , 我发现导航 PyObject
之间的差异非常困惑, PyObjectRef
, &PyObject
, Py<PyObject>
, Py<&PyObject>
.
这个函数最简单的版本是:
extern crate pyo3;
use pyo3::prelude::*;
#[pyfunction]
pub fn f(_py: Python, x: &PyObject) -> PyResult<&PyObject> {
Ok(x)
}
除其他事项外,x
的生命周期和返回值不一样,而且我看不到 pyo3
的机会增加 x
的引用计数,事实上编译器似乎同意我的观点:
error[E0106]: missing lifetime specifier
--> src/lib.rs:4:49
|
4 | pub fn f(_py: Python, x: &PyObject) -> PyResult<&PyObject> {
| ^ expected lifetime parameter
|
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `_py` or `x`
我可能有办法手动使用 _py
增加引用计数参数并使用生命周期注解让编译器满意,但我的印象是 pyo3
打算使用对象生命周期管理引用计数自身。
编写此函数的正确方法是什么?我应该尝试将它包装在 Py
中吗?容器?
最佳答案
PyObject
是 a simple wrapper around a raw pointer :
pub struct PyObject(*mut ffi::PyObject);
它有多个创建函数,每个函数对应于我们可能从 Python 获得的不同类型的指针。其中一些,例如 from_borrowed_ptr
, 在传入的指针上调用 Py_INCREF
。
因此,似乎我们可以接受 PyObject
,只要它是以“正确”的方式创建的。
如果我们 expand这段代码:
#[pyfunction]
pub fn example(_py: Python, x: PyObject) -> PyObject {
x
}
我们可以看到调用我们函数的这段代码:
let mut _iter = _output.iter();
::pyo3::ObjectProtocol::extract(_iter.next().unwrap().unwrap()).and_then(
|arg1| {
::pyo3::ReturnTypeIntoPyResult::return_type_into_py_result(example(
_py, arg1,
))
},
)
我们的论点是通过调用 ObjectProtocol::extract
创建的,它又调用 FromPyObject::extract
。这是 implemented for PyObject
通过调用 from_borrowed_ptr
。
因此,使用裸 PyObject
作为参数类型将正确地增加引用计数。
同样,当一个 PyObject
被放入 Rust 中时,它会自动 decrease the reference count .当它返回给 Python 时,ownership is transferred适本地更新引用计数取决于 Python 代码。
为 commit ed273982 完成的所有调查来自master分支,对应v0.5.0-alpha.1。
关于python - 编写等同于返回其输入对象的 Python 函数的 pyo3 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52538458/
我正在使用 pyo 在我的代码中播放一些音频。设置如下: from pyo import * import time s = Server(sr=44100, nchnls=2, buffersize
帮助,一旦我调用 pyo 音频服务器,我似乎无法打印任何东西。 它只是退出而不返回任何东西。 甚至是这样的: from pyo import * s = Server() print("this is
嗯, 是否可以使用“os.pyo”或“os.pyc”而不是“os.py”导入“os”模块? 谢谢 最佳答案 是的。如果你在没有使用 -O 的情况下启动 Python,你将需要 .pyc 文件,而使用
我有 2 个 .pyo python 文件,我可以将它们转换为 .py 源文件,但它们不能像 decompyle 的验证所暗示的那样完美编译。 因此查看源代码,我可以看出 config.pyo 只是在
当我尝试通过双击或从命令提示符运行 .pyo 文件时,出现访问被拒绝错误。 假设我有 abc.py(保留 main 方法入口点),它导入文件 xyz.py 并导入 wx 等。 我生成 .pyo 文件。
我正在尝试使用 pyo 库播放声音。 以下代码: from psychopy import sound, logging, core logging.console.setLevel(logging.
我不确定是否有人有这方面的经验,但我正在尝试使用 kivy 和 pyo(Python 数字信号处理模块)编写一个程序。 这就是我的代码的开头: from pyo import * import ti
我在 Ubuntu 14.04 中运行 python 2.7 并安装了 python-pyo 软件包,但是当我导入 pyo 模块时出现以下错误: ImportError: /usr/lib/pytho
无论我做什么,Autotools 都坚持在构建我的项目时(而不是在运行它时)生成 pyo 和 pyc 文件。问题是我的 Python 配置有些奇怪,我不想让 Python 编译器在安装过程中运行。有什
我正在研究将大量 python 模块和包编译为 pyo。我知道这可以通过设置 PYTHONOPTIMIZE 环境变量或在启动时指定 -O 来实现。我想强制执行 pyo 而不是 pyc 以产生尽可能小的
我写了一个简单的脚本test.py,包含: print('hello') 然后使用python -O test.py 运行它。我希望这会创建一个 test.pyo 文件,但它没有。 我的版本是 Pyt
我正在开发一个使用多处理和进程池的科学 Python 应用程序。有时我会犯错误并用 fork 轰炸自己。这导致我的笔记本电脑死机,我需要进行硬重置。但是,当我再次加载时,我的 python 安装似乎已
我有一个用 python 编写的代理。我想为此创建一个 RPM。这个 rpm 只会将适当的文件放在它们的位置。然后一些 python 服务器将选择它们。现在我的问题是,每当我生成 rpm 时,我都会为
这个问题在这里已经有了答案: What do the python file extensions, .pyc .pyd .pyo stand for? (2 个答案) 关闭 9 年前。 我看到 .
我需要将已编译的 Python 代码 (.pyo) 转换为其源代码。我查看 depython.net,但有一个问题。警告; “文件版本早于 2.4。” 我该怎么办? 谢谢。 最佳答案 试试这些: un
这些 python 文件扩展名是什么意思? .pyc .pyd .pyo 它们之间有什么区别以及它们是如何从 *.py 文件生成的? 最佳答案 .py:这通常是您编写的输入源代码。 .pyc:这是编译
我正在尝试启动 apache + mod_wsgi,并且我对将源 .py 文件放入服务器有严格的限制,因此我首先编译它们并将 .pyo 文件放入服务器。 这就是我在 apache conf 中的内容:
我正在试用 pyo对于 python 。我使用主页上的这些命令为 ubuntu 安装了 pyo: sudo apt-get install libjack-jackd2-dev libportmidi
这是我的测试套件。 我在一个临时文件夹中有一个自动生成的 Python 包。都是.py文件。我想以编程方式将它们编译成 (a) .pyc 和 (b) .pyo 文件。 (一个测试将执行 .pyc,另一
我将一个 Python 应用程序及其 virtenv 环境捆绑在一个 RPM 中以便于部署。省略所有 .pyo 和 .pyc 文件是否是一个明智的决定? 我要做的是在 virtenv 实例中的安装后操
我是一名优秀的程序员,十分优秀!