how - python create executable windows
¿Puedo controlar la arquitectura(32 bits frente a 64 bits) al crear un ejecutable de pyinstaller? (2)
Pyinstaller produce un binario que depende del python que usaste para construirlo. Entonces, si usa Python 2.7 64 bit, no es posible, por lo que sé, producir un ejecutable de 32 bit. Esto se debe a que Pyinstaller archiva todos los módulos y sus dependencias (dlls, pyds, etc.) que son de 64 bits debido a la instalación de python.
Como ya se dijo, es mejor, debido a problemas de compatibilidad cruzada, compilar archivos binarios de 32 bits. Probablemente puedas especificar más tu pregunta.
Pregunta corta
¿Hay alguna manera de controlar / garantizar la arquitectura (32 bits frente a 64 bits) al crear un ejecutable de pyinstaller?
Fondo
Migré de py2exe a pyinstaller debido a la falta de soporte de 64 bits junto con una serie de pequeñas cosas que me cuesta mucho mirar más allá. Así que en esa nota, preferiría no volver a ello. He desarrollado dos aplicaciones que utilizan Python 2.7 de 64 bits y tengo problemas de rendimiento al ejecutarlas en las máquinas de 32 bits.
El primero es una simple GUI de wxPython (versión 2.9) y se conecta a un archivo DLL de Windows para un controlador USB. Este parece bastante "seguro" para ejecutarse a 32 bits porque no hay módulos que sean solo de 64 bits. Sin embargo, esta aplicación cuando se ejecuta en 32bit Windows XP tiene problemas de rendimiento horribles cuando se habla con el dispositivo USB.
La segunda aplicación es mucho más grande y aún no he intentado construir y ejecutar debido al temor a los problemas de arquitectura. Esta aplicación tiene un número de módulos de solo 64 bits (psycopg2 para uno) utilizados en ella. Me gustaría evitar tratar de compilar esto si es imposible ejecutarlo como un ejecutable de 32 bits.
Pensamientos actuales
Creo que esto podría ser posible (si los módulos tienen soporte de 32 bits) ejecutando build.py con Python forzado en modo de 32 bits. ¿Tiene esto algún sentido?
Actualizar
Tuve varios avances en el primer programa que estaba construyendo. Resulta que los problemas de rendimiento se basaban únicamente en la velocidad de las dos máquinas. Mi máquina dev tenía suficiente poder para sondear el dispositivo USB lo suficientemente rápido y la plataforma de prueba mucho más lenta (Windows XP) no.
Solucioné este problema modificando la forma en que encuesté el puerto USB. Ahora que esto estaba arreglado, podía ejecutar el exe en ambos sistemas. Surgió un nuevo problema al tratar de construir el ejecutable como un solo archivo. Cuando se ejecuta Build.py de pyinstaller, extrae todas las DLL necesarias que la aplicación necesita para ejecutar. Esto pareció funcionar muy bien al principio, pero cuando intenté ejecutar el exe único que construí en Windows 7 64bit, no se ejecutaría en Windows XP porque la DLL del dispositivo USB no se reconoció como una DLL válida.
Para lograr que el exe único se ejecute en ambos sistemas, primero intenté eliminar la DLL del archivo .spec (que parece ser una secuencia de comandos de python). Fue conveniente porque pude modificar la lista de inclusiones antes del comando de compilación con los modificadores ordinarios de la lista de python. Mi esperanza era que si la DLL no se encontraba en el directorio temporal del ex, la encontraría en el sistema PATH. Si bien este enfoque podría funcionar, no podría hacer que se ejecutara sin lanzar muchos errores.
Mi segundo intento fue construir la aplicación en la máquina con Windows XP (dejando el DLL incrustado) con la esperanza de que el Win XP DLL funcionara en Windows 7. ¡Éxito! Esta configuración funciona bien; Sin embargo, creo firmemente que esta no es la mejor solución, ya que depende únicamente de la DLL más antigua que se ejecuta en un sistema operativo más nuevo.
Si está creando una aplicación y se ejecuta correctamente en Windows de 32 bits, no es necesario crear una versión de 64 bits. Simplemente cree una versión de 32 bits y ejecútela en ambas arquitecturas. ¿Para qué sirve WOW64?
Si necesita usar una biblioteca o una función que solo es de 64 bits, simplemente compile una versión de 64 bits. No tiene sentido construir una versión de 32 bits si la característica es solo de 64 bits.
La única razón para construir una versión de 64 bits y de 32 bits, es aprovechar el mayor espacio de direcciones de las ventanas de 64 bits. Es decir, si pretende asignar más de 1 o 2 GB de memoria. Un ejemplo podría ser una aplicación de edición de imágenes o una aplicación de manipulación de datos. Luego puede ejecutar en plataformas de 32 bits dentro de las restricciones de la plataforma, pero editar imágenes más grandes o cantidades más grandes de datos en plataformas de 64 bits.
IOW, para su caso, siga la sugerencia de @Velociraptors y compile en python de 32 bits si está construyendo un exe de 32 bits.