2010-02-09 4 views
0

J'ai une erreur intermittente provoquant mon module Python crash, et je suppose qu'il est à cause d'une erreur de mémoire se produit par ne pas obtenir les refcounts correcte dans le code c. J'ai un peu de code qui obtient une réponse à un moment aléatoire d'un endroit éloigné. Sur la base des données reçues, il faut mettre à jour une variable de données à laquelle je devrais avoir accès en Python. Quelle est la meilleure façon d'accomplir cela? Le code suivant s'exécute la plupart du temps, et il fonctionne correctement quand il le fait, mais quand ce n'est pas le cas, il plante Python (en affichant la boîte de débogage de Visual Studio). Merci.variable python c

if (event == kResponseEvent) { 
    list = PyList_New(0); 

    for (i = 0; i < event->count; i++) { 
     PyList_Append(list, Py_BuildValue("{s:i, s:s}", 
              "id", event->id, 
              "name", event->name)); 
    } 

    PyModule_AddObject(module, "names", list); 
} 
+1

je poste ce commentaire comme plutôt qu'une réponse, mais je me suis senti généralement que compiler la partie C en tant que lib partagé et en utilisant ctypes était plus gérable que d'utiliser la bibliothèque d'extension. Merci –

+0

- Je vais examiner cette question, d'autant plus que je suis beaucoup plus bien versé en Python que C. – jeffaudio

+0

Cython est une option encore plus glissante pour fournir des liaisons Python pour une bibliothèque C. –

Répondre

1

PyModule_AddObject() une référence steals. En tant que tel, vous ne devriez pas décréter la liste après.

+0

J'ai mis à jour le code selon votre suggestion (c'était en fait comme je l'avais initialement), mais il se bloque toujours de manière aléatoire. – jeffaudio

1

PyList_New() peut renvoyer NULL pour indiquer une erreur, que vous ne vérifiez pas. Py_BuildValue() peut renvoyer NULL pour indiquer une erreur, que vous ne vérifiez pas. PyList_Append() peut renvoyer -1 pour indiquer une erreur, que vous ne vérifiez pas non plus. PyList_Append() ne vole pas la référence, donc vous fuyez la référence à la dict renvoyée par Py_BuildValue(). Ce dernier peut entraîner une insuffisance de mémoire, ce qui peut entraîner l'échec de Py_BuildValue() ou PyList_Append(), et votre incapacité à gérer l'erreur peut provoquer un blocage.

(Quelque chose d'autre peut aussi causer Py_BuildValue() ou PyList_Append() à l'échec, mais qui est difficile à deviner de tout cet extrait.)

+0

Merci pour les informations relatives à la gestion de la mémoire. Il est intéressant, quand j'ai appelé manuellement la commande pour obtenir une réponse, il ne manquait pas, mais quand je l'ai couru d'une boucle à frapper très rapidement, il est écrasé. Cela me porte à croire qu'il pourrait y avoir quelque chose d'autre mal dans le système qui est à l'origine en fait l'accident. Je vais regarder plus dans ce problème. – jeffaudio