问题标签 [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 - 安装“Cairocffi”失败
我正在使用 python3,并且正在尝试在 Ubuntu 上安装“ cairocffi ”。为此,我已成功安装:
- 蟒蛇开发
- libffi开发
- 中菲
但是当我尝试用 安装“cairocffi”时pip install cairocffi
,我得到了:
python - distutils 的严重错误?
我正在使用 cffi 将 Python 包装器写入 C 库。我无法编译库,distutils 抛出了一些神秘的东西distutils.errors.DistutilsPlatformError "\"GNU was unexpected at this time
Python 文档中没有关于此错误的任何信息。
我的设置如下:Windows 7 Visual Studio C++ 2010
在控制台中运行 python 输出这个
并且工具链环境变量设置正确
我很困惑,无法弄清楚这里发生了什么。
python - 使用 CFFI 从 C 到 python 的 fftw_complex
问题:我想C
从FFTW
to返回结果Python
。结果存储在类型中fftw_complex
。我该怎么办?
背景:我正在使用Cmake
,试图通过调用FFTW
然后C
将结果传递给Python
。我这样做是为了学习Cmake
. 下面我有一个函数 ,int example_FFT(int NUM_POINTS)
它对长度为 的序列进行 FFT NUM_POINTS
。该序列的类型为fftw_complex
,它是一个包含实数和虚数对的结构。在我的情况下,所有实部都等于 1,虚部等于 0。
我可以编译Cmake
并成功通过测试 test.py, in Python
。
测试.py:
c代码:
我对 C 语言很陌生,并为我的问题表述不够精确而道歉。
python - CFFI 找不到函数,即使它们在库中
我正在尝试使用 CFFI 加载共享库。该代码旨在实例化 C 结构,打印并销毁它。
但我收到此错误:
用户名@Ubuntu1204VB:~/tests/cffi_tests/structure$ python main.py
Traceback(最近一次调用最后):
文件“main.py”,第 22 行,
结构 = lib.CreateStructure()
文件“/usr/local/lib /python2.7/dist-packages/cffi/api.py”,第 810 行,在 __getattr__ make_accessor(name)
文件“/usr/local/lib/python2.7/dist-packages/cffi/api.py”中,行806,在 make_accessor accessors[name](name)
文件 "/usr/local/lib/python2.7/dist-packages/cffi/api.py",第 751 行,在 accessor_function 中引发 AttributeError('%s: %s' % (name, e))
AttributeError: CreateStructure: "在库 './lib/libstructure.so' 中找不到函数 'CreateStructure': ./lib/libstructure.so: 未定义符号: CreateStructure"
因此,我使用 nm -DC 检查了 ./lib/libstructure.so 内部的内容:
@Ubuntu1204VB:~/tests/cffi_tests/structure$ nm -DC ./lib/libstructure.so
................... ... w _Jv_RegisterClasses
0000000000000731 T FreeStructure(STRUCTURE*)
0000000000000702 T PrintStructure(STRUCTURE*)
00000000000006bc T CreateStructure()
0000000000201028 A __bss_start
....................... ......... w __cxa_finalize
................... w __gmon_start__
0000000000201028 A _edata
0000000000201040 A _end
0000000000000788 T _fini
0000000000000588
T _init
.......................
...................... U malloc
...................... ....... U printf
CreateStructure 似乎在那里。
所以我创建了一个 C main 来测试这个库并且它工作正常。但是,我必须包含用于创建共享库 (./src/structure.cpp) 的源代码的库和标头 (./include/structure.h)。
然后,我将标头复制并粘贴到用于创建共享库的源代码中,因为我找不到在 Python 代码中使用库加载它的方法,并再次构建了共享库。不幸的是,我在执行 python 时仍然遇到同样的错误。这意味着问题不是来自可能丢失的头文件。
因此,我想知道是否可以在使用 ffi.dlopen("./lib/libstructure.so") 加载它们之后检查 python 代码中的符号,以确保它们被正确加载......或不是。
有什么办法可以做到这一点?我在这里缺少什么吗?
编辑:调查
我在源代码中添加了以下功能:
和 ffi.cdef 中的“int main(void)”,在 CreateStructure 的原型之上。
当我只调用 lib.main()... 它打印 42... 如果我将 int main(void) 更改为 int test(void) 并调用 lib.test(),它会给我错误“未定义符号:测试“...
如果我将其他函数的名称更改为“main”(一次一个),它们可以正常工作。就好像 cffi 只能使用名为“main”的函数......
编辑:回答评论
我收到以下make
错误simple-example/
:
请注意,我使用的是 Ubuntu 12.04,并且我刚刚使用 sudo apt-get install clang 安装了 clang。
另外,这是我用来编译共享库的makefile:
cairo - cairocffi 使用 pango 引发错误
在这段代码的最后一行 cairocffi 给出了一个奇怪的错误
这里可能是什么问题?
python - 如何获取pypy cffi的cdata类型?
我想知道'a'的值的类型。我输入了“dir(a)”之类的东西,但我找不到任何方法来做到这一点。我想要一个像下面这样的功能
但是我不确定pypy的cffi是否有这种功能。有人知道吗?
python - 如何在pypy cffi的ffi中列出每个可用的标识符?
我可以列出可用的函数名称和枚举器名称
但是, dir(lib) 不返回定义的 typedef 和结构。
当我尝试使用 cffi 加载带有任意 c 头文件的任意模块时,我必须解析头文件以获取 typedef 和结构的列表。有没有更好的方法来做同样的事情?
python - 生成器理解和列表理解迭代不同
我编写了一个函数,它使用 CFFI 将 numpy 数组传递到 C 代码中。它利用缓冲区协议和 memoryview 有效地传递数据而不复制它。但是,这意味着您需要传递 C 连续数组并确保您使用正确的类型。Numpy 提供了一个numpy.ascontiguous,
执行此操作的函数。所以我遍历参数,并应用这个函数。下面的实现是有效的,并且可能是普遍感兴趣的。但是,考虑到它被调用的次数,它很慢。(任何关于如何加快速度的一般性评论都会有所帮助。)
但是,实际的问题是,当您将第一个列表推导替换为生成器推导时,或者如果您重构代码以便np.ascontigous
在第二个推导中调用,则传递给 C 代码的指针不再指向 numpy 数组的开头. 我认为它没有被调用。我正在迭代理解并且只使用返回值,为什么使用列表理解或生成器理解会改变任何东西?
python-2.7 - Python CFFI 内存管理问题
我在 Ubuntu 上编程,使用Python 2.7.3
.
我正在使用 CFFI 使用来自某些 C 代码的值填充 Python 列表。
该列表相当大:打印时大约有 71 000 个字符。
C 代码正在使用许多库。因此,下面的代码只是为了更好地理解正在发生的事情。
该程序使用 Wingware IDE 运行良好,但*** glibc detected *** python: free(): invalid next size (fast): 0x0000000003b0b080 ***
在从命令行启动时以 glibc 错误 ( ) 结束,就在之前:
在阅读了 wim 的回答后,我检查了 IDE 和命令行是否都在使用相同的解释器运行代码——它们是 ( /usr/bin/python
)。
编辑(valgrind 报告):
编辑:
这里有一些关于 C 数据结构的更多信息。这是它的外观:
我做了一个小 C 程序来分配/释放一个完整的 C 结构,valgrind
但没有发现任何内存泄漏。
问题:
- 上述
valgrind
报告究竟是什么意思? - 从 IDE 和命令行运行程序之间可能有什么区别?
注意:IDE 使用 Python 参数-u (unbuffered)
来运行程序,但将其添加到命令行没有任何区别。 - 当我自己解除分配结构时,Python 的垃圾收集器是否在起作用?我应该
ffi.gc( c_pDataStructure, c.FreeDataStructure )
改用吗?