2009-11-21 31 views
1

J'ai une référence du fichier dll ici: http://speex.org/docs/api/speex-api-reference/group__Codec.htmlCtypes Python & libspeex.dll/libspeex.so; Quels sont les équivilents à #define, typedef et structs?

Ce que je me demande est, dans cette liste, il y a beaucoup des defines. Quel est l'équivalent python, même pour la classe struct, quelles sont mes options pour implémenter tout cela avec ctypes? Typedefs?

Je suis relativement inexpérimenté python alors s'il vous plaît pardonnez-moi si je suis moins qu'adéquate dans mes compétences. Aucun collège ne l'enseigne ici, donc j'essaie d'apprendre en demandant & google.

En ce moment je suis juste essayer de comprendre fondamentalement comment l'interface avec cette bibliothèque speex donc je peux au moins commencer à utiliser les fonctions de codage/décodage. Mais je ne suis pas sûr de la mise en œuvre de ces 3 choses. Je suis sûr que je suis sur ma tête avec cela, mais à la fin, il semble que je sors toujours en tête d'apprendre quelque chose de nouveau. Quelqu'un d'esprit me donne un bref aperçu?

D'après ce que je prends #define dans toutes fins pratiques est fondamentalement juste foo = bar?
Et Class: Struct SpeexMode serait une classe, qui a toutes les fonctions énumérées?

Ou tout cela est-il déjà défini dans la DLL compilée? Si oui, j'ai déjà fait un petit appel de fichier dll avec ctypes via un tutoriel que j'ai rencontré. Serait-ce aussi simple que de configurer l'environnement (en passant ces variables dans les fonctions pour définir des choses telles que la qualité du codec, invoquer l'encodeur, puis utiliser l'encodeur?)

Répondre

2

Pour utiliser struct, vous devez les déclarer en effet avec ctypes.Structure laisser Python savoir à leur sujet.

>>> from ctypes import * 
>>> class POINT(Structure): 
...  _fields_ = [("x", c_int), 
...     ("y", c_int)] 
... 
>>> point = POINT(10, 20) 
>>> print point.x, point.y 
10 20 
>>> point = POINT(y=5) 
>>> print point.x, point.y 
0 5 
>>> POINT(1, 2, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
ValueError: too many initializers 
>>> 

En ce qui concerne définit, ils font partie du fichier habituellement inclure, de sorte que vous aurez juste à les définir vous-même dans le code Python, parce que le compilateur C ne les voit même pas (sont convertis définit à leurs valeurs par le pré-processeur).

Si vous cherchez un convertisseur plus automatique des interfaces C/C++ vers Python, regardez SWIG. SWIG, contrairement à ctypes, vous oblige à utiliser un compilateur C en plus de Python pur.

+0

Merci pour cet exemple! - Cela m'a vraiment aidé à comprendre comment fonctionnent les structures! - Je ne savais pas que vous pourriez les appeler plus tard comme ça en les assignant à une variable et en étant capable de faire [variable]. [_ Field_] - c'est INVALUABLE. – ThantiK

+0

Aussi - Je pense vraiment que je préfère utiliser ctypes en ce moment parce que cela signifie plus tard, je peux glisser/déposer de nouvelles versions de ma DLL, et aussi je peux laisser la DLL décompressée de l'exécutable. Plus tard, je peux juste 'mettre à jour automatiquement' mon programme en envoyant une nouvelle DLL; au moins, j'espère que c'est comme ça que ça ira;) – ThantiK

0

J'ai trouvé des structures au moins, et comment fondamentalement Convertissez-les.

Fondamentalement, vous venez de faire une classe, il passe ctypes.Structure, puis faites votre tableau de champs.

comme ceci:

class PASSWD(ctypes.Structure): 
_fields_ = [("name", ctypes.c_char_p), 
      ("passwd", ctypes.c_char_p), 
      ("uid", ctypes.c_int), 
      ("gid", ctypes.c_int), 
      ("change", ctypes.c_long), 
      ("class", ctypes.c_char_p), 
      ("gecos", ctypes.c_char_p), 
      ("dir", ctypes.c_char_p), 
      ("shell", ctypes.c_char_p), 
      ("expire", ctypes.c_long), 
      ("fields", ctypes.c_int) ] 

Mais je ne suis pas sûr que je besoin même de mettre ces tout. Je suis sûr qu'ils sont tous définis dans la DLL et la configuration, non?