我想通过使用BLAS和LAPACK在C或C++中编写一些模块来扩展python和numpy.我还希望能够将代码作为独立的C/C++库进行分发.我希望这个库使用单精度和双精度浮点数.我将编写的函数的一些示例是用于求解线性系统或加速一阶方法的共轭梯度.有些函数需要从C/C++代码调用Python函数.
在使用Python/C API和Numpy/C API稍微玩了一下之后,我发现许多人主张使用Cython(例如参见这个问题或者这个问题).我不是Cython的专家,但似乎在某些情况下,你仍然需要使用Numpy/C API并知道它是如何工作的.鉴于我已经拥有(一些)关于Python/C API的知识而没有关于Cython的知识,我想知道继续使用Python/C API是否有意义,并且如果使用此API比Cython有一些优势.在未来,我肯定会开发一些不涉及数值计算的东西,所以这个问题不仅仅是关于numpy.我喜欢Python/C API的一个原因是我学到了一些关于Python解释器如何工作的东西.
谢谢.
按照这个建议,我编写了一个本机C扩展库,通过ctypes优化Python模块的一部分.我之所以选择ctypes而不是编写CPython本地库,是因为它更快更容易(只有几个函数内部都有紧密的循环).
我现在遇到了障碍.如果我希望使用distutils可以轻松地安装我的工作python setup.py install,那么distutils需要能够构建我的共享库并安装它(可能是).但是,这不是一个Python扩展模块,所以据我所知,distutils不能这样做./usr/lib/myproject
我发现了一些对其他人有这个问题的引用:
我知道我可以做一些原生的东西而不是为共享库使用distutils,或者确实使用我的发行版的包装系统.我担心的是,这会限制可用性,因为不是每个人都能轻松安装它.
所以我的问题是:当前最好的分发共享库的方法是什么,这些方法将由ctypes使用,但是其他方面是OS本机而不是Python扩展模块?
如果您可以对其进行扩展并证明为什么这是最好的方法,请随意回答上面链接的其中一个黑客.如果没有更好的东西,至少所有的信息都会在一个地方.
换一种说法: *.h/*.c --[??POSSIBLE??]--> *.pxd/*.pyx
好.我已经(我希望)在互联网上进行了足够的挖掘 - 但我认为这是一个很好的问题所以我会直截了当地问.
有一些相关的问题(例如,生成python绑定,使用什么方法/程序或在Python中包装C库:C,Cython或ctypes?)但是我不能总结我所问的情况也许是为了更"高级"的方法(特别是对于现有的库,而不是从python生成新的C).
在使用Cython之前,我已经掌握了一些经验.Cython对速度和可维护性赞不绝口.在我的书中可以使用小/单位代码 - 但是,这次我在我的板块上有更多...
遵循程序员的三大优点中的第一个 - 我希望尽可能少地完成这项工作.
所以真正的问题是如何通过.pxd和可能的.pyx文件的自动化方式来缓解创建(即节省时间而不是错误输入错误的东西).
这里似乎是关于如何做到这一点的唯一真实提示/注意事项 - 但是它上面的大多数项目都已经不存在了,旧的或者是sourceforge.许多似乎只适用于C++(这是我在这里做的).
还有人还在使用它们吗?最近?有没有人有这样的工作流程或最佳实践?我只是手动做得更好吗?
我的库由一组头文件很好地定义.一个包含所有C结构/类型的defs,另一个包含所有函数的原型.但它是loooonnnggg ...
谢谢你的任何提示.
更新(2015年8月25日):
是的,所以在过去的几个月里,当我有空余的时候,我试过:
CFFI(感谢@David指出这一点) - 有一个崇高的目标是"在不学习第三语言的情况下从Python调用C代码:现有的替代方案要求用户学习领域特定的语言(Cython,SWIG)或API(ctypes)" - 但它不太合适,因为它涉及到实际python文件中的相当程度的嵌入式C代码(或加载它).这对于一个大型库来说是一个非常手动的过程.也许我错过了一些东西......
SWIG是Python绑定的祖父,非常可靠.从根本上说,它并不像我理解的那样"放手" - 即你需要一个单独的规范文件.例如,您必须编辑所有C头文件以指示#define SWIG_FILE_WITH_INIT使用或使用其他注释构建python模块.SIP在这里也有同样的问题.您不会从标头自动生成,您可以修改它们以包含您自己的指令和注释,并创建完整的规范文件.
cwrap - 我在Mac上,所以我用这个版本来铿锵.https://github.com/geggo/cwrap真的很差的文档 - 但是使用源代码我终于让它运行并生成了... 一个非常简单的结构头的空的.pyx文件.不太好.
xdress - 这表明了承诺.该网站已关闭,所以文档实际上似乎在这里.这里有大量的工作,看起来很简单.但是它需要所有的llvm头文件(以及一个正确链接的clang版本).我不得不使用brew install llvm —with-clang.有一个xdress clang-3.5分支,但它似乎没有完成足够的修复.我尝试为早期版本的clang(安装llvm33/llvm34)点击自制软件/版本并将其构建完成.无论如何,我离题了...它对一个简单的例子非常有用,但是完整库的结果ctypes文件非常混乱并且拒绝构建.AST C-> Python中的东西有点不对......
ctypesgen不是我在原始搜索中遇到的那个.文档很稀疏 - 或者你可以称之为简洁.在过去的4年中,它似乎也没有做过多少工作(如果开发人员要进一步推进该项目,那么人们会询问问题列表).我已经尝试过运行它,但遗憾的是它似乎与我怀疑/似乎与Clang编译器cdefs.h使用的问题有关_attribute_.我尝试了类似-std=c11 但无济于事的事情.
总而言之,在我看过的所有内容中,我认为xdress最接近全自动生成的python绑定.它适用于给出的简单示例,但无法处理更复杂的现有库头,前向声明,枚举类型,void指针的所有复杂性 ......它似乎是一个设计良好且(有一段时间)维护良好的项目,因此,如果有人再次接受这些问题,可能会有一些方法来规避这些问题. …
我正在尝试编译,安装和运行我们将调用的包myPackage.它包含一个从库*.pyx中调用函数的文件.目前,当我运行导入包的脚本时,我获得以下错误消息:fftw_set_timelimit()fftwclientScript.py
Traceback (most recent call last):
File "clientScript.py", line 5, in <module>
import myPackage.myModule
ImportError: /usr/local/lib/python2.7/dist-packages/myPackage/myModule.so: undefined symbol: fftw_set_timelimit
Run Code Online (Sandbox Code Playgroud)
根据我的理解(我是python和cython的新手),我的包中尚未执行与C库的链接.的确,我的setup.py文件看起来像这样:
from setuptools import setup,find_packages
from Cython.Build import cythonize
import os
setup(
name = "myPackage",
version = "0.0.1",
url = "none",
author = "me",
author_email = "me@me.me",
packages=find_packages(),
ext_modules = cythonize("pyClo/pyClo.pyx"),
)
Run Code Online (Sandbox Code Playgroud)
如您所见,我的setup.py文件使用setuptools.我决定这样做,因为它是Python包装用户指南推荐的.但是,使用Cython文档中的说明distutils.链接库是通过调用来完成的distutils.Extension('file',['file.pyx'],libraries='fftw').如何使用相同的结果setuptools?
我知道有很多方法可以将C函数连接到Python:Python C API,scipy.weave,ctypes,pyrex/cython,SWIG,Boost.Python,Psyco ......它们最适合什么?为什么我应该使用给定的方法而不是其他方法?当我需要选择Python和C之间的绑定时应该考虑什么?
我知道有关于此的一些讨论,但它们似乎都不完整......
我知道StackOverflow上的一些问题也是相关的.例如:
我是一名Python资深人士,但在C中没有涉足太多.在互联网上找不到任何适用于我的东西半天之后,我想我会问这里并得到我需要的帮助.
我想要做的是编写一个简单的C函数,它接受一个字符串并返回一个不同的字符串.我打算用几种语言(Java,Obj-C,Python等)绑定这个函数,所以我认为它必须是纯C?
这是我到目前为止所拥有的.注意我在尝试在Python中检索值时遇到了段错误.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const char* hello(char* name) {
static char greeting[100] = "Hello, ";
strcat(greeting, name);
strcat(greeting, "!\n");
printf("%s\n", greeting);
return greeting;
}
Run Code Online (Sandbox Code Playgroud)
import ctypes
hello = ctypes.cdll.LoadLibrary('./hello.so')
name = "Frank"
c_name = ctypes.c_char_p(name)
foo = hello.hello(c_name)
print c_name.value # this comes back fine
print ctypes.c_char_p(foo).value # segfault
Run Code Online (Sandbox Code Playgroud)
我已经读过,segfault是由C释放最初为返回的字符串分配的内存引起的.也许我只是在咆哮错误的树?
什么是实现我想要的正确方法?
我正在研究的程序的概念是一个Python模块,该模块可以检测某些频率(人类语音频率80-300hz),并通过从数据库中进行检查来显示句子的语调。我使用SciPy绘制声音文件的频率,但是我无法设置任何特定频率来分析音高。我怎样才能做到这一点?
更多信息:我希望能够在语音中设置定义的模式(例如,上升,下降),并且程序将检测声音文件是否遵循特定的模式。
python speech-recognition signal-processing speech speech-to-text
在哪里可以找到 libprint 的 Python 包装器?如果这样的包装器不存在,是否可以编写一个?我该如何开始?
我正在尝试录制音频并以 1 秒为间隔获取音频的平均频率和幅度,而无需写入文件。如果您使用 pyaudio 从文件中读取,有很多关于如何完成此操作的示例,尽管可用于此特定情况的任何内容都使用 Python 2.7 库,而 Python 3.x 似乎不存在这些库。
任何帮助,将不胜感激!
python ×12
c ×6
ctypes ×4
cython ×4
distutils ×2
audio ×1
boost-python ×1
c++ ×1
interfacing ×1
numpy ×1
python-3.x ×1
setup.py ×1
setuptools ×1
speech ×1
wrapper ×1