2013-06-06 1 views
1

J'ai une bibliothèque C dans laquelle je définissais une structure arborescente:passer une structure à partir du code python à une bibliothèque C

struct node { 
    int * info; 
    struct node *left; 
    struct node *right; 
} 

Je veux faire un appel de fonctions C de python.

Je souhaite savoir quelles possibilités ai-je pour reconstruire l'arbre en python, qui est construit à l'intérieur du code C en utilisant la structure citée?

J'ai l'intention d'utiliser ctypes. Est-ce que j'ai un meilleur module pour ça?

+0

ctypes est un bon moyen de le faire –

+0

Je n'ai jamais travaillé avec. Je l'essaie maintenant. Je souhaite voir si j'ai une meilleure solution, et voir un code minimal qui fait la reconstruction d'un arbre ... – alinsoar

+0

Ne commencez pas à apprendre des ctypes en construisant des arbres. C'est comme apprendre à piloter des chasseurs à réaction avant de faire du vélo. Développez vos compétences petit à petit. –

Répondre

1

Vous pouvez vérifier cffi. C'est un peu comme les ctypes, sauf que c'est plus au niveau de l'API qu'au niveau ABI. ctypes est de niveau ABI. Il est également un peu plus jeune que ctypes, et n'est pas encore inclus avec CPython.

Vous pouvez également essayer Cython, qui vous permet de mélanger assez librement des symboles C et des symboles Python en utilisant une syntaxe de type Python. Vous pouvez utiliser Cython pour générer un fichier .c à partir d'un .pyx, où .pyx est un peu comme .py. Bien sûr, vous créez ensuite un .so à partir de votre fichier .c et l'importez dans CPython. J'ai utilisé m4 pour créer de purs python et cython à partir du même fichier - ça a bien marché.

+0

Merci. Pouvez-vous fournir quelques lignes de code qui compilent et transfèrent correctement un arbre avec 2nodes? – alinsoar

1

Apache Thrift peut être un meilleur ajustement pour vous, qui est un protocole de communication binaire développé par Facebook pour divers langages de programmation communs, y compris C++, Java, Python, Ruby ... etc (voici wiki page pour plus de détails).

Vous pouvez également être intéressé par la question suivante posée dans Stackoverflow, Thrift client-server multiple roles, qui inclut la façon dont le client appelle une fonction dans le serveur.

EDIT: Comme Thrift ne supporte que les types primitifs communs, struct, et trois types de conteneurs (liste <t1>, mis <t1>, carte < t1, t2 >), vous devez travailler avec des pointeurs. Une façon de travailler avec est d'utiliser id à la carte d'instance. Par exemple, vous pouvez attribuer un identifiant unique à chaque noeud et utiliser id pour faire référence aux noeuds gauche et droit, et avoir un mappage int pour noeud pour récupérer les noeuds par id. Voici comment le fichier .thrift de votre struct noeud pourrait ressembler à:

struct Node { 
    // a thrift struct is composed of fields; 
    // each field has a unique integer identifier, a type, a name and an optional default value. 
    1: required i32 nodeId; 
    2: required i32 infoId; 
    3: required i32 leftNodeId; 
    4: required i32 rightNodeId; 
} 

Pour la fonction (s) vous en C et souhaitez appeler de python, vous devez les emballer dans un service d'épargne. Voici le service de votre fonction pourrait ressembler (désolé, je ne savais pas l'interface de votre fonction au moment où j'éditais cette réponse):

service TreeStructureService { 
    void processTreeNode(1: Node node); 
} 

Si vous souhaitez en savoir plus sur Thrift, vous pourrait trouver Thrift: The Missing Guide utile.

+0

Merci. Pouvez-vous fournir quelques lignes de code de travail? – alinsoar

+0

Bonjour @alinsoar, [ici] (http://diwakergupta.github.io/thrift-missing-guide/) vous pouvez trouver un exemple plus détaillé sur la façon d'écrire le fichier .thrift pour travailler avec les structures et les fonctions en C++. Une chose que vous devez travailler en plus est que le type de pointeur n'est pas pris en charge dans la friperie. Une façon de contourner le problème est de créer un identifiant pour chaque nœud d'arbre, utilisez left_node_id et right_node_id, et maintenez une carte d'int-to-node dans votre code C++ pour trouver le bon nœud d'arbre. – keelar

+0

@alinsoar, j'ai inclus des exemples de codes d'épargne pour votre structure de noeud et une fonction C possible pour le noeud de traitement. – keelar

Questions connexes