2009-07-22 6 views
3

Python est "suspendu" lorsque j'essaie d'importer une bibliothèque partagée C++ dans la version Windows de python 2.5 et je ne sais pas pourquoi.Python se bloque lors de l'importation de Wrapper généré par Swig

Sous Linux, tout fonctionne correctement. Nous pouvons compiler tout notre code C++, générer des classes wrapper swig. Ils compilent et peuvent être importés et utilisés dans python 2.5 ou 2.6. Maintenant, nous essayons de porter le code sur Windows en utilisant Cygwin.

Nous sommes capables de compiler chacune des bibliothèques C++ en DLL partagées en utilisant -mno-cygwin, ce qui supprime la dépendance à cygwin1.dll. Essentiellement, cela fait que la cible gcc est MinGW au lieu de Cygwin, ce qui permet d'exécuter les binaires qui en résultent dans Windows sans dépendre de Cygwin. De plus, chacune de ces bibliothèques partagées peut être liée à des binaires C++ et être exécutée avec succès. Une fois celle-ci terminée, nous avons utilisé swig pour générer des wrappers pour chacune des bibliothèques partagées. Ces wrappers sont générés, compilés et liés sans problème.

L'étape suivante consistait alors à importer le wrapper python généré dans python. Nous sommes en mesure d'importer toutes sauf deux de nos bibliothèques. Pour les deux qui ne fonctionnent pas, lorsque nous essayons d'importer les fichiers .py ou .pyd dans Windows python (la version compilée avec Visual C++), python se bloque. Nous ne pouvons pas tuer python avec ctrl + c ou ctrl + d, le seul recours est de le tuer via le gestionnaire de tâches. Si nous attachons gdb au processus python et que nous imprimons une trace de pile, nous recevons surtout des ordures, rien d'utile.

Ensuite, nous avons essayé de supprimer les blocs de code dans les fichiers * .i et de recréer les wrappers swig. Ce processus m'a au moins permis d'importer les bibliothèques dans Windows python, mais le problème est que nous avons dû commenter trop de fonctions qui sont nécessaires au fonctionnement du logiciel. En général, il y avait trois types de fonctions qui devaient être commentées: les fonctions statiques, les fonctions const virtuelles, et les fonctions publiques régulières qui n'étaient pas déclarées comme const. Cela est également reproductible, si nous supprimons une de ces fonctions, l'importation se bloque à nouveau.

Ensuite, nous avons essayé d'extraire les fonctions dans un simple programme hello world, de générer un wrapper swig et de les importer dans python. Cela a fonctionné. Nous avons copié des fonctions exactement à partir des fichiers d'en-tête. Ils travaillent dans le très petit programme de test, mais pas dans la plus grande bibliothèque partagée. Nous les construisons exactement de la même manière. Donc, toutes les idées sur la raison pour laquelle cela se produit ou même simplement de meilleures techniques de débogage seraient très utiles.

Cela fonctionne correctement sous Linux avec gcc 3 et 4 et python 2.5 et 2.6. Sous Windows, c'est le logiciel que je me sers: gcc 3.4.4 rasade 1,39 (binaires Windows à partir swig.org) python 2.5.4 (binaires Windows et inclut/libs de python.org)

Ces sont les commandes que j'utilise pour construire le programme simple hello world (la librairie complète utilise les mêmes options, c'est beaucoup plus long en raison des options supplémentaires -I, -L et -l)

swig -C++ -python -o test_wrap.cc test.i

gcc -c -mno-Cygwin test.cc

gcc -c -mno-Cygwin test_wrap.cc -I/usr/Python25/include

dlltool --export-all --output définition _test.def test.o

gcc -mno-Cygwin -shared -s test_wrap.o test.o -L/usr/Python25/libs -lpython25 -lstdC++ -o _TestModule.pyd

Merci, AJ

Répondre

1

Une technique que je l'ai utilisé est d'insérer un point d'arrêt "dur" (__asm int 3) dans le module fonction init. Ensuite, exécutez-le dans un débogueur ou exécutez-le simplement et laissez le débogueur Windows apparaître lorsque l'interruption est appelée.

Vous pouvez télécharger un débogueur Windows agréable à partir de Microsoft here.

Questions connexes