2011-09-24 4 views
5

Je suis nouveau dans l'intégration de python. J'essaie d'intégrer du code python + numpy dans une fonction de rappel C++ (à l'intérieur d'une DLL)Incorporation de code python + numpy dans un rappel dll C++

Le problème auquel je suis confronté est le suivant. si j'ai:

Py_Initialize(); 
// some python glue 
// python invocation 
Py_Finalize(); 

tout fonctionne bien.

mais si j'ai:

Py_Initialize(); 
_import_array(); //to initialize numpy C-API 
// some python glue + numpy array object creation 
// python invocation via PyObject_CallObject() 
Py_Finalize(); 

cette plante à la deuxième fois qu'il atteint _import_array(); Si je fais plutôt l'initialisation python et numpy juste une fois et la finalisation dans le destructeur (donc pas à chaque fois initialisation/finalisation), tout se bloque quand on laisse le rappel.

le problème ici, je suppose est numpy, mais je ne sais pas comment résoudre

+0

Si vous pouvez parfaitement contrôler la façon dont la DLL est construit, je serais peronally laisser les détails à distutils et rasade. Voici un exemple de projet (interfaçage avec numpy): https://github.com/martinxyz/python/tree/master/realistic – maxy

Répondre

1

Essayer assurez-vous que votre .dll n'est initialisé une fois, quel que soit le nombre de fois que le code est effectivement invoqué.

Voici un lien sur « C++ Singleton dans une DLL »:

Singleton in a DLL?

+0

Bonjour Paul, merci pour votre réponse! Donc, je suis assez sûr que ma DLL est initialisée une seule fois, et en fait, j'ai omis de dire que si j'initialise aussi python à l'initialisation de ma DLL, et finaliser dans le destructeur, quelque chose comme ça fonctionne: ' PyRun_SimpleString (' ' "de temps à l'importation de temps, ctime \ n" ' ' "de numpy import * \ n" ' ' "print 'Aujourd'hui est', ctime (time()) \ n" '\t ') ' mais si j'essaye d'appeler python via PyObject_CallObject(), alors cela ne marche plus, et il se bloque quand le callback se termine –

+1

Hi - 1) Assurez-vous d'initialiser Python seulement UNE FOIS pendant l'exécution du programme (et deinitialize PLUS qu'une fois, sinon jamais). 2) Regardez l'exemple de code martinxyz posté ci-dessus, 3) Regardez ce fil - un problème similaire, causé par une erreur de compte de référence: http://www.velocityreviews.com/forums/t566237-pyobject_callobject-code-dump-after -calling-4-times.html – paulsm4

+0

Merci beaucoup Paul, ce lien m'a beaucoup aidé! en fait, le problème était un DECREF d'un objet utilisé par PyTuple_SetItem(). Maintenant, cela semble fonctionner, mais je dois faire des tests plus approfondis, bien sûr! Merci encore! –