是否可以通过 Cython 通过引用将值从 Python 传递到 C++?

Posted

技术标签:

【中文标题】是否可以通过 Cython 通过引用将值从 Python 传递到 C++?【英文标题】:Is it possible to pass values by reference from Python to C++ via Cython? 【发布时间】:2021-05-10 11:13:30 【问题描述】:

是否可以创建一个包含指向 Python 变量的指针的 C++ 对象?我担心 Python 变量是 PyObject,因此 C++ 无法正确读取它。

举个例子,这里是官方Cython website的教程,针对我的问题稍作改动。 main.py 的结果是错误的

Main.py(使用 Rectangle 对象的地方)

import rect
x0, y0, x1, y1 = 1, 2, 3, 4
rect_obj = rect.PyRectangle(x0, y0, x1, y1)
print(rect_obj.get_area())

x0 = 10                       # change value PyRectangle points to
print(rect_obj.get_area())

结果

-403575482
-407128282

矩形.cpp

#include <iostream>
#include "Rectangle.h"

namespace shapes 

    // Overloaded constructor
    Rectangle::Rectangle (int x0, int y0, int x1, int y1) 
        this->x0 = &x0;
        this->y0 = y0;
        this->x1 = x1;
        this->y1 = y1;
    

    // Return the area of the rectangle
    int Rectangle::getArea () 
        return (this->x1 - *(this->x0)) * (this->y1 - this->y0);
    

为了清楚起见,我没有发布其他文件,因为我认为它们对于理解我的问题没有必要。

【问题讨论】:

&amp;x0获取的指针在构造函数返回后立即失效,因为它是参数的地址。 有道理。我猜我太习惯 Python了。 这在 Python 中也不起作用;分配给x0 对除该变量之外的任何内容都没有影响。 这取决于你传递给对象的内容。在这种情况下,你是对的。在做了一些研究之后,我找不到解决我的问题的方法。因此,我也将在 C++ 中声明和定义 x0,并编写一个函数来用 Python 更改它。感谢您的帮助! “因此 C++ 无法正确读取它”——Python C API 正是为此目的。 Python 整数是不可变的(通常也是“单例”)。 【参考方案1】:

在进行一些实验时,我找到了一个解决方案,您必须显式调用您在 .pyx 中定义的 cinit 方法文件。

新的 python 文件看起来像这样

import rect
x0, y0, x1, y1 = 1, 2, 3, 4 \
rect_obj = rect.PyRectangle() \
rect_obj._cinit_(x0, y0, x1, y1) \
print(rect_obj.get_size()) \
print(rect_obj.get_area())

你的 .pyx 看起来像这样

from Rectangle cimport Rectangle

cdef class PyRectangle:
    cdef Rectangle c_rect

def _cinit_(self, int x0, int y0, int x1, int y1):
    self.c_rect = Rectangle(x0, y0, x1, y1)

def get_area(self):
    return self.c_rect.getArea()

def get_size(self):
    cdef int width, height
    self.c_rect.getSize(&width, &height)
    return width, height

def move (self, dx, dy):
    self.c_rect.move(dx, dy)

【讨论】:

以上是关于是否可以通过 Cython 通过引用将值从 Python 传递到 C++?的主要内容,如果未能解决你的问题,请参考以下文章

Informatica 是不是可以将值从 informatica 映射动态传递到 oracle 中的视图

如何将值从节点返回到原点(angular2 请求)

如何通过 ajax 将值从 django 模板发送到视图?

通过 AsyncTask 将值从第一个活动传递到第三个活动

无法通过命令将值从视图传递到viewmodel

如何将值从javascript变量传递给剃刀变量?