首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PyCodeObject解除PyO3的编组?

如何使用PyCodeObject解除PyO3的编组?
EN

Stack Overflow用户
提问于 2020-03-22 17:42:09
回答 1查看 242关注 0票数 1

我正在读取.pyc文件,需要能够解组代码对象。当我试图将已解封的PyAny降为PyCodeObject时,我会得到以下错误消息:

代码语言:javascript
复制
error[E0277]: the trait bound `pyo3::ffi::code::PyCodeObject: pyo3::type_object::PyTypeInfo` is not satisfied
   --> src/lib.rs:179:47
    |
179 |         let code = *(loads(py, &code_buffer)?.downcast::<PyCodeObject>()?);
    |                                               ^^^^^^^^ the trait `pyo3::type_object::PyTypeInfo` is not implemented for `pyo3::ffi::code::PyCodeObject`
    |
    = note: required because of the requirements on the impl of `for<'py> pyo3::conversion::PyTryFrom<'py>` for `pyo3::ffi::code::PyCodeObject`

error[E0277]: the trait bound `pyo3::ffi::code::PyCodeObject: pyo3::instance::PyNativeType` is not satisfied
   --> src/lib.rs:179:47
    |
179 |         let code = *(loads(py, &code_buffer)?.downcast::<PyCodeObject>()?);
    |                                               ^^^^^^^^ the trait `pyo3::instance::PyNativeType` is not implemented for `pyo3::ffi::code::PyCodeObject`
    |
    = note: required because of the requirements on the impl of `for<'py> pyo3::conversion::PyTryFrom<'py>` for `pyo3::ffi::code::PyCodeObject`

做这件事的正确方法是什么?

MCVE

代码语言:javascript
复制
use pyo3::{ffi::PyCodeObject, marshal::loads, Python};

fn main() {
    let gil_guard = Python::acquire_gil();
    let py = gil_guard.python();
    let code_buffer = &include_bytes!("__pycache__/test.cpython-37.pyc")[16..];
    let code = *(loads(py, &code_buffer)
        .unwrap()
        .downcast::<PyCodeObject>()
        .unwrap());
}

要创建测试文件:

python(3) -c 'import ...')

  • There folder

  • Replace中的
  1. 创建.py文件
  2. 导入模块(例如,应该是__pycache__
    1. 中的.pyc文件,在调用include_bytes!的代码中使用实际路径

    中的路径)

版本信息

2020-03-08)

  • cargo
  • Rust 2018
  • rustc 1.43.0--每晚(564758c4c 1.43.0-bda50510d 2020-03-02)
    • CPython 3.7.3
    • PyO3 0.9.1

    )

EN

回答 1

Stack Overflow用户

发布于 2020-03-23 02:55:47

我想我已经想好了该怎么做

代码语言:javascript
复制
let code_ptr = loads(py, &code_buffer)?.as_ptr() as *mut PyCodeObject;
// This should be valid, since PyCodeObject is Copy, as long as the refcount is positive
let code = unsafe { *code_ptr };
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60802806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档