问题标签 [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.
python - 您是否必须触发对使用来自 Python-CFFI 的 ffi.gc() 创建的变量的最后引用的销毁?
该接口基于 LuaJIT 的 FFI (...)
在LuaJIT 网站上阅读(关于ffi.gc()
):
此功能允许将非托管资源安全地集成到 LuaJIT 垃圾收集器的自动内存管理中。典型用法:
那么,使用 Python-CFFI,您是否必须通过将其设置为 (ie) 来触发对使用实例化的变量的最后一个引用的销毁ffi.gc
(= 需要一个特殊的函数进行释放,因为它的某些部分是动态分配的)ffi.NULL
?
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
提前致谢。
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 函数?
python - 在 Python 中使用其名称(Python 字符串)获取枚举中的 C 变量值
基本上,我在 Python 中封装了一个 C API(使用 CFFI(非常棒))。
我在那个 C API 中有一个枚举:
在 Python 中,我以字符串 : 的形式接收该枚举中的变量名称"enum1"
。我想得到value1
。
使用CFFI
,您可以包装一个枚举并轻松访问其成员(这里是一个示例)。我的问题是我有代表变量名称的字符串,而不是变量本身。
因此,cwrapper.c."enum1"
将不起作用(cwrapper
作为包装模块的名称和包装库时 c
返回的名称)。ffi.dlopen(libname)
我可以制作一个字典,将变量名称作为字符串映射到实际变量,例如:
但在这一点上,我最好将枚举重写为 Python 字典。
我知道我也可以使用正则表达式来读取 C 文件,但我认为还有一种更好的方法来处理它,这是我没有想到的。任何想法?
python-cffi - 大约 100 次迭代后,带有 CFFI 段错误的“多处理”回调
一个 PyPy 回调,当我将 Python 对象移动到单独的多处理进程中时(直接)实现(直接)作为 Python 对象的方法时,它完美地工作(在无限循环中),在大约 100 次迭代后出现段错误。
在我的主要代码中:
这个想法是多个任务应该同时提供相同数量的回调。我不知道是什么导致了段错误,尤其是因为它在前 100 次左右的迭代中运行良好。非常感谢帮助!
python - 使用 CFFI 在 Python 中创建 CData 类型的缓冲区
我正在尝试在 Python 中创建一个具有特殊类型的缓冲区,以将其发送到用 CFFI 包装的 C 函数。
在C中,我有类似的东西:
然后,在 Python 中,上面的行在ffi.cdef()
我的缓冲区实例化代码中,如下所示:
C 函数接收 UINT8**。
并且...在 C 函数中以进一步的分段错误结束。
所以我print buffers[ i ]
使用后ffi.cast
:
我错过了什么?缓冲区一覆盖就被垃圾收集tmp_buffer
吗?
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 是:
还:
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 。
python-2.7 - 尝试使用 pip 时出现运行时错误
我通过做一些看似无害的事情成功地把自己搞砸了。
我从我的 python 脚本中收到以下错误(brand['feed'] = 我发出请求的 URL):
所以我问了互联网,互联网说这样做:
所以我这样做了,现在当我运行相同的脚本时,我不断收到 RuntimeError,疯狂的是,即使我只是尝试在 shell 中运行 pip,我也会收到同样的错误!
我已经搜索了这个错误,似乎找不到任何有帮助的东西。我在 Windows Server 2008 R2 Standard 64 位上使用 python 2.7.6
gcc - 在不使用 gcc for cffi 编译的情况下评估常量
我正在尝试为共享库编写一个 python 接口。该库提供了标题,因此我希望能够将它们用作cdef
输入。
我意识到我需要在将标头加载到 CFFI 之前对其进行预处理。但是,库头文件的代码如下:
它来自预处理器 ( gcc -E
) 为
CFFI 抱怨 251 不是一个简单的数字常数(就解析而言,这是真的)。有没有办法让 GCC 在预处理器时评估这些整数常量?
(当然,我意识到我可以手动更改头文件,但我想看看我是否可以使用库附带的头文件)