无法将python项_如何为Cython创建具有依赖项的单独文件以及如何修复编译错误:无法将Python对象转换为“mySet *”...

博主在尝试使用Cython构建Python扩展时遇到问题。已成功创建ccommontypes.pxd和commontypes.pyx以导出通用数据类型,但在进一步扩展时发现需要在不同模块间重新声明已定义的类型,如myArray和mySet。博主担心这可能导致问题。此外,在构造函数中调用C函数分配内存时,遇到了将Python对象转换为'mySet*'的错误。寻求解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在尝试使用Cython构建我的fisrt python扩展。

我的C文件在逻辑上是分区的,功能是“嵌套的” - 在该模块中,C依赖于模块B中定义的函数,然后依赖于模块A.

我发现很难理解如何对我的.pxd和.pyx文件进行分区,以便我可以维护功能模块之间的依赖关系。

以下片段希望能帮助澄清这种情况:

注意:文件FooBar.h包含一个CommonDefs.h文件,该文件声明通用数据类型并为这些常见类型(myArray和mySet)提供了一个简单的API。

我已经创建了ccommontypes.pxd和commontypes.pyx文件,用于导出在CommonDefs.h和CommonDefs.c中声明/定义的数据类型和函数。我能够从中成功编译一个python扩展模块。

我现在想要转到下一个阶段,即导出依赖于CommonDefs.h的数据类型和函数。但是,我发现我不得不重新声明类型

myArray和mySet(即使它们已经在ccommontypes.pxd中声明)

我似乎无法找到任何导入或包含这些声明,所以我不得不在下面的文件中重新声明它们,因为这些函数接受了myArray和mySet类型的参数。

问题1

重新声明这些类型是否可以重新声明,正如我在下面所做的,或者是否有任何我需要注意的陷阱?

//cfoobar.pxd

cdef extern from "../include/FooBar.h":

cdef struct FooBar:

pass

ctypedef struct myArray: // already declared elsewhere

pass

ctypedef struct mySet: // Already declared elsewher

pass

struct FooBar * foobar_new(mySet *s1)

//foobar.pyx

cimport cfoobar

cdef class FooBar:

cdef cfoobar.FooBar *_foobar

def __cinit__(self, myset):

_foobar = cfoobar.foobar_new(myset);

if (ret == 0):

raise MemoryError()问题2

从上面的FooBar ctor代码中,内存分配函数需要一个指向mySet变量的指针。但是,当我尝试编译此代码时,出现此错误:

无法将Python对象转换为'mySet *'

我理解错误信息,但由于Python不是静态类型的,我不知道如何指定数据类型。

我希望在解决这个问题上有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值