问题标签 [python-cffi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
157 浏览

python - Ctypes:来自 C 定义的数据类型

我有一个函数的地址以及它的“c-like”表示(来自llvmlite,但这并不重要)。

对于将两个双精度值相加并返回它们的函数,代码如下所示:cfunc = CFUNCTYPE(c_double, c_double, c_double)(func_ptr)

这会很好,但是我的函数的参数可以在类型和数量上有所不同。在 python 中,这可以通过一些for arg in args生成器来解决。

但是我没有工具(或者至少我没有找到)如何将我的类型“转换”或解析为 ctype 的工具。

参数是llvmlite-Type对象,所以我有一个类似 c 的类型表示可用。


我的方法是创建一个 dict,它可以将 llvmlite-Type 对象或 c 表示映射到 ctypes 的 Type 对象。一个小解析器也可以提供帮助。

ctype 不是已经提供了这样的东西吗?一个神奇的功能: ctypes.magic("double") == ctypes.c_double

我不受ctypes的约束。我知道 CFFI 存在,但是我对它的经验为 0,而且就我在文档中的查看而言,我什至找不到单个函数地址的基本解决方案。

我知道我的用例很少见,因为这两个库都更关心库而不是特定函数的地址。

0 投票
0 回答
697 浏览

python-3.x - 在 Python 3 中使用 GTK 和 Cairo 进行并行绘图

我正在制作一个 GTK 应用程序,它将绘制可能需要很长时间才能完成的复杂图像。因此,我无法在 DrawingArea 的“绘制”回调中进行绘制。我决定使用 Python 的多处理模块,它允许真正的并行性,并且在 GTK 和线程安全方面没有问题。

Python 的多处理模块使用 Pickle 协议在进程之间进行通信。GTK 和 Cairo 对象不实现该协议。我的解决方案是将 Cairo 表面转换为字节,然后通过管道将其发送到另一个进程。

经过一番研究,我发现 Cairo 有办法获取和设置 ImageSurface 的内部数据,但 Pycairo for Python 3 不支持它。(Python 2 的 Pycairo 似乎有支持,但我有一些理由使用 Python 3。)

然而,还有另一个 Python 库cairocffi支持它。所以我决定:

  1. 使用 cairocffi 在单独的进程中绘制。
  2. 将生成的表面转换为字节。
  3. 通过管道发送字节并将它们转换回 cairocffi 表面。
  4. 将 cairocffi 曲面转换为 Pycairo 曲面并显示。

这是一个方法吗?我的代码有错误吗?我真的不明白这个conversion_magic.py文件。

主文件

转换魔法.py

在 Windows 上使用 GTK 3.18.9 和 Python 3.4 进行了测试。

0 投票
1 回答
639 浏览

python - CFFI 如何避免手动设置 LD_LIBRARY_PATH

我正在使用 python CFFI 围绕一些名为 libfpta 的外部库构建一个包装器,我想将其放入我的 python 存储库 (myrepo/lib/libfpta.so) 中,从而与 python 代码一起分发。第一个好处是实际上生成了表示为共享对象 (_amnesia.so) 的包装器,但为了导入它,我必须正确设置 LD_LIBRARY_PATH。换句话说

我一直试图通过设置来解决这个问题

按照那里的建议,在我的 set_source 声明中,它不起作用。

0 投票
1 回答
617 浏览

python - Python CFFI doesn't copy typedef from cdef() into generated C file

I'm feeding a generated header file into ffi.cdef(), with a bunch of typedefs like this at the beginning:

Then I try to compile it:

But it generates C code like this:

Which causes the build to fail, because the symbol LE_GPIO_EDGE_RISING isn't defined anywhere (or referenced anywhere else)

0 投票
2 回答
1983 浏览

python - 如何在 python cffi 中实例化一个结构?

我正在尝试使用 Python cffi 库实例化一个结构。我想从我自己的 .h 文件和标准库中实例化一个结构。

0 投票
0 回答
189 浏览

python-3.x - 从 RecordingSurface 到 PDFSurface 的 set_source_surface 与原始翻译给出了 PNG 但空的 PDF

在这个例子中,我在沿 X 坐标移动的同时,在 Y 坐标中距离原点 30px 处绘制一些线元素。这是在记录表面上绘制的,因为在我的真实代码中,在开始之前我不知道扩展。绘制完成后,我在 PDFSurface 上重复绘制,但由于我希望我的 PDF 和 PNG 与我绘制的元素齐平,我将 PDFSurface 的边界设置为 RecordingSurface 的 ink_extents 的高度和宽度。接下来因为我在下方绘制了 30 像素,上面只有空白空间,所以我将我的绘图转换为 set_source_surface -30 像素。现在,在编写 PNG 时一切正常,但 PDF 为空。如果我手动将高度扩展到 100px,则 PDF 会以正确的原点正确绘制。如果我从 Y 0px 而不是 Y 30px 开始绘图,它也可以工作。我错过了什么还是一个错误?

谢谢你的帮助。这是一个测试代码:

0 投票
1 回答
805 浏览

python - 使用 CFFI 从 Python 传递指向 C 函数的指针的最佳方法

我想为第三方库中的 C 函数创建一个 Python 包装器,该库具有诸如

其中函数f修改输入参数x(即,使用指针通过引用调用)。实现 Python 包装函数的最有效方法是什么,以便 Python 用户可以将其视为每次只返回一个新数字的函数?示例伪代码:

我应该使用数组模块(例如,创建一个大小为 1 的“双”数组,将其传递给函数,然后返回第一个索引)?是否有使用 ctypes 或 cffi 辅助函数的更轻量级的方法?

0 投票
1 回答
6675 浏览

python - CFFI:TypeError:ctype 'char[]' 的初始化程序必须是字节或列表或元组,而不是 str

使用Python 的 CFFI 库,我试图将 Python 字符串哄骗到 char* 中,以便我可以将它传递给接受 char* 的 C 函数。我似乎无法弄清楚正确的咒语是什么。

考虑这个例子:

结果是:

以下也不起作用:

它说:

0 投票
1 回答
402 浏览

c - 使用 CFFI 使用 struct 测试 C 代码时出现类型错误

我正在做一个 cffi 测试演示,当我尝试运行 python 测试器文件时,它返回以下错误: TypeError: initializer for ctype 'Car *' 似乎确实是 'Car *',但类型不同(检查您是否没有混淆不同的 ffi 实例)

car.h 文件定义了 C 结构 Car,如下所示:

这是我试图用来测试 C 代码的使用 cffi 的 python 文件。

任何关于这个问题的建议都将非常受欢迎。我觉得我已经经历了一百次。

提前致谢

0 投票
0 回答
77 浏览

python - Python CFFI 函数的签名?

我正在使用cffiPython 模块包装一些库。我正在为它们编写模拟库,并且我想确定对 cffi 包装函数的特定调用是否会由于调用签名不匹配而导致错误。

我大致尝试编写以下调用is_call_valid