Le programme C compilé avec Cygwin et appelé à partir de Python se bloque

ctypes d’appeler le programme ac de Python en utilisant ctypes . J’ai un exemple minimum (non) de travail ci-dessous.

Programme C

Voici le programme C dans lequel je tente d’appeler. Juste votre programme standard Hello World. Je comstack ceci, sous Windows, en utilisant eclipse et le compilateur cygwin gcc pour produire un fichier .dll .

main.h

 #ifndef INC_MAIN_H_ #define INC_MAIN_H_ void helloWorld(); unsigned char buf[] = "Hello World!"; #endif /* INC_MAIN_H_ */ 

principal c

 #include  #include "main.h" void helloWorld(){ printf("\n%s\n\n", buf); } 

Programme Python

Ensuite, j’écris un script python pour charger mon .dll et appelle la fonction helloWorld . Il est important de noter que je récupère à la fois le .dll j’ai créé et le cygwin1.dll .

helloWorld.py

 from ctypes import CDLL import os def loadDLL(file): file = file.replace('\\','/') if not os.path.exists(file): raise FileNotFoundError(file) print('Opening DLL File:', file) dll = CDLL(file) return dll if __name__ == '__main__': dll = loadDLL(FILE_TO_LOAD) dll.helloWorld() 

Quand je vais exécuter ce programme, loadDLL fonctionne très bien et charge la DLL. Cependant, l’appel de la fonction helloWorld partir du programme c provoque son blocage.

Curieusement, si je remplace la ligne printf par quelque chose d’inoffensif (par exemple, int x = 0 ), elle s’exécute correctement mais affiche un nombre apparemment aléatoire.

Quelqu’un peut-il m’indiquer ce que je fais mal? Ou même un moyen de comprendre ce qui ne va pas?

En fait, j’ai réussi à obtenir une configuration presque identique qui fonctionne parfaitement sur un système Linux, alors je suppose que cela est dû à l’environnement Windows que j’ai configuré, mais je ne pouvais pas commencer à deviner de quoi il s’agissait réellement.

METTRE À JOUR

Je n’écris pas ceci comme une réponse car cela ne résout pas la lettre du problème, mais seulement l’esprit.

À la suggestion de Jean-François Fabre, j’ai abandonné cygwin pour mingw et tout fonctionne comme prévu. Apparemment, cygwin fonctionne de manière étrange. Ahmed Masud a été en mesure de trouver un lien utile sur la manière dont les programmes cygwin devraient être compilés s’ils devaient être utilisés pour des bibliothèques externes, mais cela semblait être bien plus compliqué que de simplement utiliser mingw (sans parler des autres problèmes que j’avais déjà rencontrés en essayant d’utiliser cygwin pour cela).

FWIW, ce programme doit également être exécuté sur la ligne de commande afin de voir la sortie du programme c. L’exécution dans IDLE de python n’a pas capturé la sortie printf du programme c.

Le problème est que vous appelez un programme cywgin depuis un python not cygwin et que vous avez des attentes erronées.

Les programmes cygwin ont un paradigme différent (semblable à Posix) des programmes Windows normaux.

Il est recommandé de tester avec cygwin python et le compilateur, ou les deux fenêtres.