Estoy desarrollando en Windows, y he buscado en todas partes sin encontrar a nadie hablando de este tipo de cosas.C++ con incrustación de Python: bloqueo si Python no está instalado
Hice una aplicación C++ en mi escritorio que incrustó Python 3.1 usando MSVC. Conecté python31.lib e incluí python31.dll en la carpeta de ejecución de la aplicación junto al ejecutable. Funciona muy bien. Mi código de extensión e incrustación definitivamente funciona y no hay fallas.
Envié la carpeta de ejecución a mi amigo que no tiene Python instalado, y la aplicación falla para él durante la fase de configuración de scripting.
Hace unas horas, probé la aplicación en mi computadora portátil que tiene Python 2.6 instalado. Obtuve el mismo comportamiento de bloqueo que mi amigo, y mediante la depuración descubrí que era la llamada Py_Initialize() la que falla.
Instalé Python 3.1 en mi computadora portátil sin cambiar el código de la aplicación. Lo ejecuté y funciona perfectamente. Desinstalé Python 3.1 y la aplicación se bloquea de nuevo. Puse el código en mi aplicación para vincular dinámicamente desde el python31.dll local, para asegurarme de que lo estaba usando, pero sigo teniendo el bloqueo.
No sé si el intérprete necesita más que la DLL para iniciar o qué. No he podido encontrar ningún recurso sobre esto. La documentación de Python y otras guías parecen no tener en cuenta cómo distribuir sus aplicaciones C/C++ que usan la incrustación de Python sin que los usuarios instalen Python localmente. Sé que es más un problema en Windows que en Unix, pero he visto varias aplicaciones de Windows C/C++ que incrustan Python localmente y no estoy seguro de cómo lo hacen.
¿Qué más necesito aparte de la DLL? ¿Por qué funciona cuando instalo Python y luego dejo de funcionar cuando lo desinstalo? Parece que debería ser tan trivial; tal vez es por eso que nadie realmente habla de eso. Sin embargo, realmente no puedo explicar cómo lidiar con este problema.
Muchas gracias de antemano.
¿Su llamada a loadlibrary tiene éxito? ¿Dónde estás poniendo el dll? Podría ser tan simple como que la aplicación no pueda encontrar la biblioteca. – patros
LoadLibrary tuvo éxito, al igual que GetProcAddress. Como recibí la misma excepción que hice sin el enlace dinámico (en lugar de una violación de acceso NULL), creo que se llamó a Py_Initialize. La DLL está en el directorio de ejecución. Mi directorio de ejecución contiene:. \ Ss_server.exe,. \ Python31.dll,. \ Admin.sqlite,. \ Settings.py,. \ Err.txt – apostrophest