从另一个文件调用 Cython cdef 函数

问题描述 投票:0回答:1

我想从另一个文件调用一个文件中定义的 cdef 函数。我不想将 cdef 函数更改为 cpdef,但我愿意更改第二个文件。

文件1参数.pyx

cdef class Parameters:
    cdef int myVal

    def __init__(self):
        self.myVal = 0

    cdef change_myVal(self):
        self.myVal = 3

文件2模型.pyx

from parameters import Parameters

cpdef single_run():
    parameters = Parameters()
    parameters.change_myVal()

我得到的错误是:“AttributeError:'parameters.Parameters'对象没有属性'change_myVal'”

python cython
1个回答
0
投票

我遇到了类似的问题,我修复它的方法(这可能是一种黑客)是在类定义之外添加一个接受类实例的函数,并单独添加该函数。无论出于何种原因,仅对类(通过

cimport
)进行
cimport
操作并没有以我可以从另一个文件访问 cdef 方法的方式进行操作。所以在 file1parameters.pyx 中我们有:
cimport_from_pyx

在 File2 model.pyx 中,我们有

cdef class Parameters: def int myVal def __init__(self): self.myVal = 0 cdef change_myVal(self): self.myVal = 3 cdef void change_PVal(Parameters P) noexcept nogil: P.change_myVal()

在这里,我们 Python 导入了 
from parameters import Parameters from parameters cimport Parameters, change_PVal cpdef single_run(): cdef Parameters parameters = Parameters() change_PVal(parameters)

类,但我们还引入了

Parameters
参数,以便将其识别为 Cython 扩展。然后,我不是直接使用
cimport
,而是通过作为单独函数导出的
change_myVal
函数来访问它。由于某种原因,当调用
change_PVal
ed 类的方法引发
cimport
时,这会起作用。
也许有人可以解释为什么会发生这种情况,至少在使用 

AttributeError

编译器选项时。

    

© www.soinside.com 2019 - 2024. All rights reserved.