问题标签 [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 回答
228 浏览

python - 您是否必须触发对使用来自 Python-CFFI 的 ffi.gc() 创建的变量的最后引用的销毁?

阅读Python CFFI 文档

该接口基于 LuaJIT 的 FFI (...)

LuaJIT 网站上阅读(关于ffi.gc()):

此功能允许将非托管资源安全地集成到 LuaJIT 垃圾收集器的自动内存管理中。典型用法:

那么,使用 Python-CFFI,您是否必须通过将其设置为 (ie) 来触发对使用实例化的变量的最后一个引用的销毁ffi.gc(= 需要一个特殊的函数进行释放,因为它的某些部分是动态分配的)ffi.NULL

0 投票
0 回答
156 浏览

c++ - 如何为 CFFI 结构分配和取消分配内存

我在 C++ 中有如下结构

我正在尝试通过 CFFI 为该结构创建一个对象,并为成员分配值并将创建的对象传递给 C++ 中的 API。

现在,当我尝试通过使用 ffi.dlopen ApiName(par1,par2,deltaUser,par4)加载的 dll 将这个 deltaUser 传递给 C++ 中的 API 时,此时python 崩溃。在 Windows 和 Linux 中都会发生崩溃。

这段代码有什么问题?我正在使用 python2.7 和 cffi 1.5.2

在回溯上给出以下日志。发现值被优化了

在 ffi_call (cif=0x7ffff1189260, fn=0x7ffff0488faa , rvalue=0x7ffff118e098, avalue=0x7ffff118e078) 在 src/x86/ffi64.c:484 在 cdata_call (cd=0x7ffff118c0d0, args=0x7ffff7ee4_cffi_kend.c:=) 2637 in PyObject_Call (func=0x7ffff118c0d0, arg=, kw=) at Objects/abstract.c:2529 in do_call (f=, throwflag=) at Python/ceval.c:4239 call_function (f=, throwflag=) at Python/ ceval.c:4044

提前致谢。

0 投票
1 回答
598 浏览

python-cffi - 多个 ffi 定义与 ffi.include(...)

我有一些 cffi 定义分布在几个项目子目录中——每个 cffi 文件定义类型和函数,每个都编译成一个_<package>.py要加载的文件。在最终的应用程序中,我ffi.include()在顶层(递归地ffi.include()为较低级别的)并生成一个编译 _<app>.py文件以加载到应用程序中。我使用单个ffi实例来加载*.so文件。但是,我看不到这是如何将扩展_<package>.py文件加载到应用程序中的。我收到以下错误(示例):

两个单独的 FFI 定义文件,root/get/ffi_getA.py以及root/use/ffi_useA.py

哪些 C 函数都是同一个库的一部分,比如libA.so.

ffi_getA.py

ffi_useA.py

在应用程序中:

这种混合是行不通的,所以问题是:

如何通过通用/单个 ffi 对象访问/加载分布在各种已编译 ffi 对象上的 cdef 函数?

0 投票
2 回答
488 浏览

python - 在 Python 中使用其名称(Python 字符串)获取枚举中的 C 变量值

基本上,我在 Python 中封装了一个 C API(使用 CFFI(非常棒))。

我在那个 C API 中有一个枚举:

在 Python 中,我以字符串 : 的形式接收该枚举中的变量名称"enum1"。我想得到value1

使用CFFI,您可以包装一个枚举并轻松访问其成员(这里是一个示例)。我的问题是我有代表变量名称的字符串,而不是变量本身。

因此,cwrapper.c."enum1"将不起作用(cwrapper作为包装模块的名称和包装库时 c返回的名称)。ffi.dlopen(libname)

我可以制作一个字典,将变量名称作为字符串映射到实际变量,例如:

但在这一点上,我最好将枚举重写为 Python 字典。

我知道我也可以使用正则表达式来读取 C 文件,但我认为还有一种更好的方法来处理它,这是我没有想到的。任何想法?

0 投票
1 回答
220 浏览

python-cffi - 大约 100 次迭代后,带有 CFFI 段错误的“多处理”回调

一个 PyPy 回调,当我将 Python 对象移动到单独的多处理进程中时(直接)实现(直接)作为 Python 对象的方法时,它完美地工作(在无限循环中),在大约 100 次迭代后出现段错误。

在我的主要代码中:

这个想法是多个任务应该同时提供相同数量的回调。我不知道是什么导致了段错误,尤其是因为它在前 100 次左右的迭代中运行良好。非常感谢帮助!

0 投票
2 回答
1328 浏览

python - 使用 CFFI 在 Python 中创建 CData 类型的缓冲区

我正在尝试在 Python 中创建一个具有特殊类型的缓冲区,以将其发送到用 CFFI 包装的 C 函数。

在C中,我有类似的东西:

然后,在 Python 中,上面的行在ffi.cdef()我的缓冲区实例化代码中,如下所示:

C 函数接收 UINT8**。

并且...在 C 函数中以进一步的分段错误结束。

所以我print buffers[ i ]使用后ffi.cast

我错过了什么?缓冲区一覆盖就被垃圾收集tmp_buffer吗?

0 投票
1 回答
539 浏览

python - 如何将 numpy ND 数组转换为 CFFI C++ 数组并再次返回?

我想通过 CFFI 将一个 numpy 数组传递给一些(其他人的)C++ 代码。假设我不能(在任何意义上)更改 C++ 代码,其接口是:

我将 Nbins 作为 python 整数传递,ParamsArray 作为 dict -> 结构传递,但是 DataArray (shape = 3 x NBins,需要从 numpy 数组中填充,这让我很头疼。(cast_matrix from Why is cffi so much faster比 numpy?在这里没有帮助:(

这是一次失败的尝试:

作为参考, cast_matrix 是:

还:

如何将 Numpy 数组传递给 cffi 函数以及如何将其取出?

https://gist.github.com/arjones6/5533938

0 投票
1 回答
4202 浏览

python - 给定源代码,如何使用 CFFI 调用现有的 C 函数?

我有一个 C 源/头文件,它是一个更大项目的一部分。我想将其作为一个单元进行测试,独立于实际项目。虽然可以在 C 中通过使用不同main()的 .框架等

我的印象是我可以用 CFFI 做到这一点。这是一个示例 C 文件:

标题:

这是一个试图编译它的脚本,所以我可以调用一些函数:

最终,我计划在一组单元测试之前将其作为设置的一部分,例如。纯 Python 函数将通过在测试设置中构造的对象test_add()调用并检查 C 函数的结果。add()ffi

上面的脚本似乎有效;它运行没有错误,它创建一个_magic_tests.c文件、一个_magic_tests.cp35-win32.pyd文件和一个Release目录。我也可以import _magic_tests没有错误。

但我不知道如何通过 CFFI 实际调用 C 函数。我找不到该set_source()函数的任何文档,它似乎是整个过程不可或缺的一部分。概述提到了很多,但参考文献中出现的次数为零。文档确实有一个关于调用函数的部分,但它引用了某个lib对象而没有显示它是如何创建的。如果我查看前面的示例,则有一个从 中lib创建的对象ffi.dlopen(),但我不知道如何将其应用于 CFFI 本身正在生成的东西。

我的大问题(即我的X 问题)是:

  • CFFI 是否是用于以跨平台(Windows 7-10、Linux、OS X)方式调用和测试 C 函数的合理工具,如果是,如何?

我目前的方法(即我的Y 问题)引起的问题是:

  • 文档在哪里set_source()?我怎样才能找出它需要什么论据?
  • 如何生成lib包含我要调用的函数的对象?
  • 这是使用 CFFI 调用 C 函数的最简单方法吗?我并不特别需要或不希望生成共享库或可再发行包;如果它必须发生,那很好,但没有必要。我还可以尝试哪些其他方法?

我目前的设置是:

  • 操作系统:Windows 10
  • Python:CPython 3.5.1 32 位
  • 点数:8.1.2
  • CFFI:1.6.0
  • C 编译器:Visual C++ Build Tools 2015 附带的任何内容,链接自此 MSDN 帖子

我正在使用Christoph Gohlke 的存储库中的 CFFI 和 pycparser 。

0 投票
1 回答
1126 浏览

python-2.7 - 尝试使用 pip 时出现运行时错误

我通过做一些看似无害的事情成功地把自己搞砸了。

我从我的 python 脚本中收到以下错误(brand['feed'] = 我发出请求的 URL):

所以我问了互联网,互联网说这样做:

所以我这样做了,现在当我运行相同的脚本时,我不断收到 RuntimeError,疯狂的是,即使我只是尝试在 shell 中运行 pip,我也会收到同样的错误!

我已经搜索了这个错误,似乎找不到任何有帮助的东西。我在 Windows Server 2008 R2 Standard 64 位上使用 python 2.7.6

0 投票
0 回答
103 浏览

gcc - 在不使用 gcc for cffi 编译的情况下评估常量

我正在尝试为共享库编写一个 python 接口。该库提供了标题,因此我希望能够将它们用作cdef输入。

我意识到我需要在将标头加载到 CFFI 之前对其进行预处理。但是,库头文件的代码如下:

它来自预处理器 ( gcc -E) 为

CFFI 抱怨 251 不是一个简单的数字常数(就解析而言,这是真的)。有没有办法让 GCC 在预处理器时评估这些整数常量?

(当然,我意识到我可以手动更改头文件,但我想看看我是否可以使用库附带的头文件)