2016-08-16 95 views
3

我试图总结包含只有两个.C源文件一个非常简单的C库:dbc2dbf.cblast.c如何正确包装一个C库与Python CFFI

我做以下(来自文档):

import os 
from cffi import FFI 
blastbuilder = FFI() 
ffibuilder = FFI() 
with open(os.path.join(os.path.dirname(__file__), "c-src/blast.c")) as f: 
    blastbuilder.set_source("blast", f.read(), libraries=["c"]) 
with open(os.path.join(os.path.dirname(__file__), "c-src/blast.h")) as f: 
    blastbuilder.cdef(f.read()) 
blastbuilder.compile(verbose=True) 

with open('c-src/dbc2dbf.c','r') as f: 
    ffibuilder.set_source("_readdbc", 
          f.read(), 
          libraries=["c"]) 

with open(os.path.join(os.path.dirname(__file__), "c-src/blast.h")) as f: 
    ffibuilder.cdef(f.read(), override=True) 

if __name__ == "__main__": 
    # ffibuilder.include(blastbuilder) 
    ffibuilder.compile(verbose=True) 

这不太合适。我想我不包括blast.c正确;

任何人都可以帮忙吗?

+0

不确定为什么你需要的''FFI()''两个实例。这当然不在文档中... –

回答

2

这里是解决方案(测试):

import os 
from cffi import FFI 

ffibuilder = FFI() 

PATH = os.path.dirname(__file__) 

with open(os.path.join(PATH, 'c-src/dbc2dbf.c'),'r') as f: 
    ffibuilder.set_source("_readdbc", 
          f.read(), 
          libraries=["c"], 
          sources=[os.path.join(PATH, "c-src/blast.c")], 
          include_dirs=[os.path.join(PATH, "c-src/")] 
         ) 
ffibuilder.cdef(
    """ 
    static unsigned inf(void *how, unsigned char **buf); 
    static int outf(void *how, unsigned char *buf, unsigned len); 
    void dbc2dbf(char** input_file, char** output_file); 
    """ 
) 

with open(os.path.join(PATH, "c-src/blast.h")) as f: 
    ffibuilder.cdef(f.read(), override=True) 

if __name__ == "__main__": 
    ffibuilder.compile(verbose=True) 
+0

我想我仍然可以摆脱'blast.h'的cdef,因为我不需要从那里暴露任何函数。 – fccoelho

+0

我应该提到,没有@ armin-rigo帮助我不会找到这个解决方案!再次感谢! – fccoelho