2016-08-16 77 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