ctypes Python et des pointeurs de fonction
-
22-08-2019 - |
Question
Ceci est lié à href="https://stackoverflow.com/questions/867850/creating-a-wrapper-for-ac-library-in-python"> , mais Je sentais que je devrais demander dans une nouvelle question.
Fondamentalement utilise FLAC les pointeurs de fonction pour callbacks et de mettre en œuvre avec callbacks ctypes, vous utilisez CFUNCTYPE
pour les prototypes, et vous utilisez la fonction prototype()
pour les créer.
Le problème que j'ai avec ce que je me suis dit que je créerais ma fonction de rappel en tant que telle (je ne montre pas les structures que j'ai recréées, FLAC__Frame est une structure):
write_callback_prototype = CFUNCTYPE(c_int, c_void_p,
POINTER(FLAC__Frame),
POINTER(c_int32), v_void_p)
Le problème que j'ai est la mise en œuvre. FLAC__Frame est jamais instanciée par le programmeur, il est seulement appelé à partir de la fonction d'initialisation, et le traitement functions.I doivent écrire la fonction de rappel moi-même, mais il problème est que je ne sais pas comment je le faire, alors si quelqu'un sAIT je faire cela, alors un peu d'aide serait grandement apprécié.
La solution
Selon le vous pouvez définir ctypes rappel docs fonction python
def my_callback(a, p, frame, p1, p2)
pass
et puis créer un pointeur vers une fonction C appelable comme ceci:
callback = write_callback_prototype(my_callback)
Ce pointeur de fonction peut alors être passé dans flac
Autres conseils
Le problème que j'ai est la mise en œuvre. FLAC__Frame est jamais instanciée par le programmeur, il est seulement appelé à partir de la fonction d'initialisation, et le traitement functions.I doivent écrire la fonction de rappel moi-même, mais il problème est que je ne sais pas comment je le faire, alors si quelqu'un sAIT je faire cela, alors un peu d'aide serait grandement apprécié.
Dans ce cas, il suffit d'utiliser:
import ctypes
class FLAC__Frame(ctypes.Structure):
pass
et faire semblant qu'il est déjà défini, et ne se soucient pas parce que vous avez seulement besoin pointeur, ce qui est essentiellement la position dans la mémoire.