Programa C compilado con Cygwin y llamado desde Python Hangs
Estoy tratando de llamar a un programa c desde Python usandoctypes
. Tengo un ejemplo mínimo (no) de trabajo a continuación.
Aquí está el programa C al que intento llamar. Solo su programa estándar hello world. Compilo esto, en Windows, usando eclipse y el compilador cygwin gcc para producir un.dll
archivo.
main.h
#ifndef INC_MAIN_H_
#define INC_MAIN_H_
void helloWorld();
unsigned char buf[] = "Hello World!";
#endif /* INC_MAIN_H_ */
C Principal
#include <stdio.h>
#include "main.h"
void helloWorld(){
printf("\n%s\n\n", buf);
}
Programa PythonLuego escribo un script de Python para cargar mi.dll
y llama alhelloWorld
función. Es importante destacar que detengo tanto el.dll
Yo creé y elcygwin1.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()
Cuando voy a ejecutar este programa,loadDLL
funciona bien y carga la DLL. Sin embargo, llamando alhelloWorld
La función del programa c hace que se cuelgue.
Por extraño que parezca, si reemplazo elprintf
alinearse con algo inocuo (por ejemplo,int x = 0
), se ejecuta bien pero imprime un número aparentemente aleatorio.
¿Alguien puede señalarme lo que estoy haciendo mal? ¿O incluso una forma de descubrir qué está pasando?
Por cierto, pude obtener una configuración casi idéntica para funcionar bien en un sistema Linux, así que supongo que se debe al entorno de Windows que configuré, pero no pude comenzar a adivinar qué es realmente.
ACTUALIZAR
No escribo esto como respuesta porque no resuelve la letra del problema, sino solo el espíritu.
ASugerencia de Jean-Francois Fabre Dejé a Cygwin por mingw y ahora las cosas funcionan como se esperaba. Aparentemente, Cygwin trabaja de formas extrañas.Ahmed Masud fue capaz de encontrarun enlace útil sobre cómo se deben compilar los programas de cygwin si se van a usar para bibliotecas externas, pero eso parecía mucho más problemático que simplemente usar mingw (sin mencionar los otros problemas que ya había encontrado al tratar de usar cygwin para esto).
FWIW, este programa también debe ejecutarse en la línea de comando para ver la salida del programa c. Correr en IDLE de python no capturó elprintf
salida del programa c.