- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用一个指针来改变一个python对象的值,这是我试过的:
这个有效:
def main():
cdef int i
cdef int* iptr
i = 5
iptr = &i
iptr[0] = 1
print(i) # this works, prints 1
还有这个:
cdef class A:
cdef int i
def __init__(self, i): self.i = i
def main():
cdef int* ptr
cdef A a
a = A(5)
ptr = &a.i
ptr[0] = 1
print(a.i) # this works too
但是当我尝试对对象使用类似的代码时,我无法让它工作:
from cpython cimport PyObject
cdef class A:
cdef object o
def __init__(self, o): self.o = o
def main():
cdef PyObject* ptr
cdef A a
a = A(list())
# I also tried with `<void*>a.o`, `<PyObject*>a` and `<void*>a`
ptr = <PyObject*>a.o
# this segfaults
# ptr[0] = dict()
# print(a.o)
# this doesnt compile: Cannot convert Python object to 'PyObject'
# ptr[0] = None
# print(a.o)
# this doesnt compile: incompatible types when assigning to type ‘PyObject’ from type ‘struct PyObject *’
# ptr[0] = <PyObject>None
# print(a.o)
# this doesnt compile: Cannot assign type 'PyObject *' to 'PyObject'
# ptr[0] = <PyObject*>None
# print(a.o)
最佳答案
如果您愿意将要更改的对象引用声明为 PyObject *
,而不是 object
,则可以这样做。此外,为了使其工作,您必须自己管理对象的引用计数。这就是你在做的交易——一旦你放弃了获取和设置变量的 Python 方式,你就进入了 C 风格的内存管理领域,一个错误可能会导致你泄漏内存、访问无效数据、删除你的对象在你完成它们之前,并且在你犯下内存管理罪之后很久就会出现神秘的错误。因此,我真的建议不要走这条路,而是使用标准的 pythonic 方式设置变量来引用对象。
但是,如果您确实需要,此代码可以按照您希望示例运行的方式运行。
from cpython cimport PyObject
from cpython.ref cimport Py_INCREF, Py_XDECREF
cdef class A:
cdef PyObject *o
def __init__(self, o):
cdef PyObject *tmp
tmp = self.o
Py_INCREF(o)
self.o = <PyObject *>o
Py_XDECREF(tmp)
def main():
cdef PyObject **ptr
cdef PyObject *tmp
cdef A a
a = A(list())
ptr = &a.o
new_obj = dict()
tmp = ptr[0]
Py_INCREF(new_obj)
ptr[0] = <PyObject *>new_obj
Py_XDECREF(tmp)
print <object>a.o
请注意,每当我们更改 PyObject
引用时,我们首先递增新对象的引用,更改指针,然后递减对旧对象的引用。我建议您始终遵循该模式 - 在递增之前递减会导致错误,如果您重置变量以引用同一对象,您可能会释放仍在使用的对象。
此外,请务必在操作 Python 对象(包括更新其引用计数)时保持 GIL。
似乎没有办法说服 Cython 为您提供指向对象引用的指针,除非您以 C 风格声明对象引用。 (即 PyObject *
而不是 object
——尽管当你的程序运行时这两件事实际上是一样的。区别只在编译时,Cython 会自动执行object
变量而非 PyObject *
变量的引用管理。)
关于python - 如何将 PyObject* 指针设置为 None?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28801871/
如果我想获得 PyObject 之类的东西,比如 sys.exc_info,我可以写 PyObject *sys_module = PyImport_Import("sys"); PyObject *
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在从 C++ 函数调用 Python 函数,如下所示。 void CPPFunction(PyObject* pValue) { ... pValue = PyObject_CallObj
我正在尝试获取 PyObject* 中保存的数据的内存地址(具体来自 Python.h 3.8.2),以便我可以对缓冲区执行 memcpy。我只能弄清楚如何将数据从对象中复制出来,但仅靠获取指针就什么
我正在编写一个 C 函数,它将 PyObject* 作为参数并根据数据类型对其进行处理。例如。如果它是一个字符串、一个整数、一个 double 数、一个列表等。 我正在寻找检查数据类型的方法,你能给我
我正在实现一个 C 函数作为 Python 的扩展。里面abstract.h ,我发现了以下内容: /* ==== Iterators ================================
在 Julia 中,我调用 Python 模块 pandas_datareader 从网络下载数据: using PyCall @pyimport datetime @pyimport pandas_
我正在尝试使用 Python 打开一个对话框以接受输入到我的 C++ 应用程序中。 这是我正在尝试做的事情的一个非常简单的表示: #include #include int main() {
我正在用 C++ 编写 Python 3 扩展,我正试图找到一种方法来检查 PyObject 是否存在。与定义其实例布局的类型(结构)相关。我只对静态尺寸 PyObject 感兴趣, 不是 PyVar
我正在开发一个嵌入了 Python 的 C 程序。 宿主程序是多进程,通过共享内存(mmap)进行通信。 我在一个进程中创建了一个 Python 对象(例如 PyDict_New)。如何将此数据复制到
这个问题在这里已经有了答案: reading a global variable of python in c (2 个答案) 关闭 6 年前。 有没有办法获取现有对象的对象引用,在嵌入式 Pyth
我正在努力创建一个 python c 扩展,但很难找到关于我想做什么的文档。我基本上想创建一个指向结构的指针并能够访问该指针。示例代码如下。任何帮助将不胜感激。 typedef struct{ in
我是 Python/C API 的新手,虽然我有一些基本的功能可以使用,但我正在努力使用这个功能。 PyObject* sum_elements(PyObject*, PyObject *o) {
我正在尝试在 Jython 中创建和转换对象,但收到以下错误: Exception in thread "MainThread" java.lang.ClassCastException: org.p
如何从 C++ 获取 PyObject 的引用计数? 有函数 Py_INCREF 和 Py_DECREF 可以增加/减少它,但我还没有找到返回对象引用计数的函数。 我需要它来进行调试。 最佳答案 每个
我有一个 C python 扩展,我想打印一些诊断信息。 我收到一个字符串作为 PyObject*。 获取此对象的字符串表示形式的规范方法是什么,使其可用作 const char *? 最佳答案 使用
我想为我的 C 函数编写一个包装器,因为我想从 python 代码中调用它。所以我的包装器函数是 static PyObject* my_func_wrapper(PyObject *self, Py
我在 C-API 上比较了 2 种语言...Tcl 和 Python...与外部 C-API 函数交互...问题是 const char*字符串表示... Tcl Tcl_Obj *obj=…; co
我想用一个指针来改变一个python对象的值,这是我试过的: 这个有效: def main(): cdef int i cdef int* iptr i = 5
假设我有这个结构: typedef struct { PyObject_HEAD Foo* myFoo; } PyFoo; 假设 Foo 是: class Foo { public: he
我是一名优秀的程序员,十分优秀!