2010-01-28 5 views
1

Disons que j'ai une bibliothèque c qui manipule un monde en quelque sorte.Passage de plusieurs arguments à la fonction C dans Python

Je souhaite utiliser cette bibliothèque avec python. Je veux être capable d'écrire des scripts python simples qui représentent différents scénarios de gestion du monde.

J'ai des fonctions qui créent et détruisent un monde: void * create (void); int destroy (void * monde);

Voici un code python:

import ctypes 

lib = ctypes.CDLL('manage_world.so') 

_create = lib.create 
_create.restype = ctypes.c_void_p 

_destroy = lib.destroy 
_destroy.argtypes = [ctypes.c_void_p,] 
_destroy.restype = ctypes.c_int 

def create_world(): 
    res = _create() 
    res = ctypes.cast(res, ctypes.c_void_p) 
    return res 

def destroy_world(world): 
    return _destroy(world) 

new_world = create_world() 
print type(new_world) 

print destroy_world(new_world) 

Maintenant, je veux ajouter des fonctions comme: int set_world_feature (vide monde *, feature_t f, ...); int get_world_feature (void * monde, feature_t f, ...); Le truc c'est que dans mon wrapper python je ne sais pas comment passer divers arguments multiples.

Parce que parfois set_world_feature() est appelée avec 3 ou 4 arguments.

En Python à nouveau:

def set_world_feature(world, *features): 
    res = lib.set_world_feature(world, *features) 
    return world_error[res] 

Comment résoudre ce problème pour que cela fonctionne?

Répondre

1

Quand vous faites:

def create_world(): 
    return _create 

Vous n'appelez pas _create, alors create_world renvoie le pointeur de fonction. Si vous voulez le pointeur vers votre instance de monde, vous devez écrire à la place:

def create_world(): 
    return _create() 
Questions connexes