我刚刚开始熟悉Cython,尝试将一些结构从C库包装到Python方法和类。我真正不了解的是从(初始化的)C结构到相应的Python类的转换应该如何工作。我在这里想念的是什么:
C头文件中的片段:
struct test_struct {
int _something;
complex_struct* _another;
};
typedef struct test_struct test;
test *test_new(void);
int some_method(test **n, int irrelevant);
我的.pxd对应的代码段:
cdef struct test_struct:
pass
ctypedef test_struct test
test* test_new()
int some_method(test **n, int irrelevant)
我的.pyx:
def do_something(int irrelevant):
cdef test* t = test_new()
ret = some_method(&t, irrelevant)
# Here comes the problem...
return <Test?>t
cdef class Test:
cdef test* _t
# cinit here and some methods here. No members except _t
直到return语句的所有内容都可以正常工作。我在ret
等中获得了正确的值。但是return语句中的强制转换似乎不正确或缺少更多信息。发出t = do_something(42)
Python段错误时。
段故障本身根本没有帮助:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a9e74b in internal_print () from /usr/lib/libpython2.7.so.1.0
(gdb) bt
#0 0x00007ffff7a9e74b in internal_print () from /usr/lib/libpython2.7.so.1.0
#1 0x00007ffff7a81adb in PyFile_WriteObject () from /usr/lib/libpython2.7.so.1.0
#2 0x00007ffff7b19acb in sys_displayhook () from /usr/lib/libpython2.7.so.1.0
#3 0x00007ffff7a64c23 in PyObject_Call () from /usr/lib/libpython2.7.so.1.0
#4 0x00007ffff7af2ff7 in PyEval_CallObjectWithKeywords () from /usr/lib/libpython2.7.so.1.0
#5 0x00007ffff7af6f3b in PyEval_EvalFrameEx () from /usr/lib/libpython2.7.so.1.0
#6 0x00007ffff7af91b0 in PyEval_EvalCodeEx () from /usr/lib/libpython2.7.so.1.0
#7 0x00007ffff7af92b2 in PyEval_EvalCode () from /usr/lib/libpython2.7.so.1.0
#8 0x00007ffff7b11f9f in run_mod () from /usr/lib/libpython2.7.so.1.0
#9 0x00007ffff7b13ec0 in PyRun_InteractiveOneFlags () from /usr/lib/libpython2.7.so.1.0
#10 0x00007ffff7b140ae in PyRun_InteractiveLoopFlags () from /usr/lib/libpython2.7.so.1.0
#11 0x00007ffff7b1470e in PyRun_AnyFileExFlags () from /usr/lib/libpython2.7.so.1.0
#12 0x00007ffff7b24bcf in Py_Main () from /usr/lib/libpython2.7.so.1.0
#13 0x00007ffff746f000 in __libc_start_main () from /usr/lib/libc.so.6
#14 0x000000000040073e in _start ()
如您所见,该do_something
方法应返回Test类型的Python对象。我需要添加什么才能使转换成功?我需要手动将结构映射到Python类吗?我可以使用一些Cython魔术吗?
您需要Test
围绕C类型制作一个实际的包装器。但是您也不能将C参数传递给Python函数(例如构造函数)。因此,您还需要一个工厂功能。这是一个例子:
cdef class Test:
cdef test* _t
def __cinit__(self):
self._t = NULL
def _setup(self, test* t):
self._t = t
return self
property something:
def __get__(self):
return self._t._something
def __set__(self, int val):
self._t._something = val
cdef Test_create(test* t):
return Test()._setup(t)
然后在do_something()
:
return Test_create(t)
本文向大家介绍cython 包装DLL:从C ++到Cython到Python,包括了cython 包装DLL:从C ++到Cython到Python的使用技巧和注意事项,需要的朋友参考一下 示例 这展示了一个用Cython包装C ++ dll的简单例子。它将涵盖以下主要步骤: 使用Visual Studio使用C ++创建示例DLL。 用Cython包裹DLL,以便可以在Python中调用它。
问题内容: 我想从Python应用程序调用C库。我不想包装整个API,只包装与我的情况相关的函数和数据类型。如我所见,我有三个选择: 在C中创建一个实际的扩展模块。可能有点过头了,我还想避免学习扩展编写的开销。 使用Cython将C库的相关部分公开给Python。 使用Python与外部库进行通信,从而完成整个工作。 我不确定2)还是3)是更好的选择。3)的优点是它是标准库的一部分,并且生成的代码
问题 你想使用Cython来创建一个Python扩展模块,用来包装某个已存在的C函数库。 解决方案 使用Cython构建一个扩展模块看上去很手写扩展有些类似, 因为你需要创建很多包装函数。不过,跟前面不同的是,你不需要在C语言中做这些——代码看上去更像是Python。 作为准备,假设本章介绍部分的示例代码已经被编译到某个叫 libsample 的C函数库中了。 首先创建一个名叫 csample.p
问题内容: 我有许多C函数,我想从python调用它们。cython似乎是要走的路,但我无法真正找到实现此目的的示例。我的C函数如下所示: 我要做的就是指定前三个参数(一个字符串和两个整数),并恢复8个numpy数组(或python列表。所有双精度数组都有N个元素)。我的代码假定指针指向已分配的内存块。同样,产生的C代码应该链接到一些外部库。 问题答案: 这是一个从逻辑上将numpy数组传递给外部
问题内容: 我在C库中有这样的结构。DataFn中的函数指针指向静态函数。 。H 使用objdump,该表仅包含DATAFUNC和gcc的其他内容。 这在C语言中很好,在其中调用fn1就像DATAFUNC.fn1(…,…),但是这样的东西如何包装起来,以便可以在python w / ctypes中调用fn1呢? python示例 结果是 这是相似的,但是没有工厂功能。 问题答案: [Python
问题内容: 我有一个带有几个子包的Python包。 在myproject.scripts.myscript中,如何访问myproject.models?我试过了 我以前必须解决此问题,但我永远不记得应该怎么做。这对我来说并不直观。 问题答案: 这是正确的版本: 如果失败,则是因为尚未设置包含的目录。 恐怕其他人会建议一些技巧,让您避免设置。我敦促您不要理them它们。这就是存在的原因:告诉Pyth