2017-06-14 1 views
0

J'essaie d'instancier une structure en utilisant la bibliothèque Python cffi. Je voudrais instancier une structure de mon propre fichier .h ainsi que ceux de la bibliothèque standard.Comment instancier une structure dans python cffi?

import datetime 
import os 
from cffi import FFI 

clib = None 

script_path = os.path.dirname(os.path.realpath(__file__)) 

ffi = FFI() 
with open(os.path.join(script_path, 'myheader.h'), 'r') as myfile: 
    source = myfile.read() 
    ffi.cdef(source) 
clib = ffi.dlopen('mylib') 

# these all fail 
ffi.new("struct tm") 
ffi.new("struct tm[]", 1) 
ffi.new("struct tm *") 
ffi.new("struct mystruct") 

Répondre

1

ffi.new("struct mystruct") est incorrect, vous voulez dire probablement ffi.new("struct mystruct *").

struct tm est très probablement pas défini dans la cdef(), à savoir dans votre cas, il ne figure pas à l'intérieur myheader.h. Vous devez le définir dans le cdef() avant de pouvoir l'utiliser, même s'il se trouve dans l'un des en-têtes standard courants.

Vous êtes probablement mieux d'utiliser set_source() pour cela (le mode API), car vous pouvez ensuite utiliser une définition approximative de struct tm, par ex. quelque chose comme:

struct tm { 
    int tm_sec; 
    int tm_min; 
    int tm_hour; 
    int tm_mday; 
    int tm_mon; 
    int tm_year; 
    ...;  /* literally a "..." here */ 
}; 

Si vous utilisez dlopen() (le mode ABI), alors vous devez plutôt utiliser exactement la même déclaration que l'on trouve dans les en-têtes de votre plate-forme. Le résultat est moins portable.