我应该如何动态生成和编译C库以用于ctypes?

时间:2014-11-18 18:57:36

标签: python ctypes distutils

我已经为我的问题找到了一个有效的解决方案,但我想要更多的控制权。

以下是所需行为的完整描述:由于效率问题,我需要在numpy数组上执行一些C代码。我有一个Python模块,根据我在运行时提供的一些参数生成此C代码。我想将这个C代码编译成动态库,然后用ctypes加载它并为我的numpy数组调用它。 我正在使用的函数的原型永远不会改变,只会改变它们的内容,因此ctypes调用本身已被修复并隐藏在其他地方。

我现在实现这一目标的方法是使用以下代码:

self.write_cfile(cfile_name)
builder = distutils.command.build_ext.build_ext(
distutils.dist.Distribution({'name' : os.path.basename(cfile_name)}))
builder.extensions = [
        distutils.core.Extension(
               'lib' + os.path.basename(cfile_name),
               sources = [cfile_name + '.c'])]
builder.build_lib = os.path.abspath(lib_folder)
builder.build_temp = tempfile.gettempdir()
builder.swig_opts = []
builder.verbose = True
builder.run()
self.clib = np.ctypeslib.load_library(
               'lib' + os.path.basename(cfile_name),
               lib_folder)

然后,我可以毫无问题地访问self.clib,并且代码按预期工作。但是,我没有看到编译本身的任何输出(我最初假设verbose选项会有帮助)而且我不知道将哪些编译选项传递给编译器(我只是希望默认的-O2是在有)。

任何人都可以提供使用distutils的{​​{1}}命令的替代方法(我确实注意到某处有build_ext,但我无法绕过文档),或者可以给我一些关于更好地控制ccompiler本身行为的指示?

编辑: 爬过distutils源一段时间之后,我确实发现在build_ext函数中调用了log个对象,这个答案https://stackoverflow.com/a/14100459/4205267向我展示了如何控制冗长度。 现在,当我导入所有内容时,我只需添加以下两行:

spawn

我仍然不确定这是否是最好的方法来做到这一点......

0 个答案:

没有答案