2011-08-23 24 views
23

Pregunta breve
¿Hay alguna forma de controlar/garantizar la arquitectura (32 bits frente a 64 bits) al compilar un ejecutable de pyinstaller?¿Puedo controlar la arquitectura (32 bits frente a 64 bits) al compilar un ejecutable de pyinstaller?

Antecedentes
que emigraron de py2exe a PyInstaller debido a la falta de apoyo de 64 bits junto con una serie de pequeñas cosas que estoy teniendo un tiempo duro en busca pasado. Entonces, en esa nota, preferiría no para volver. He desarrollado dos aplicaciones usando Python 2.7 de 64 bits y tengo problemas de rendimiento cuando ejecuto en ellas máquinas de 32 bits.

La primera es una sencilla 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 como 32 bits porque no hay módulos que sean solo de 64 bits. Sin embargo, esta aplicación cuando se ejecuta en Windows XP de 32 bits tiene problemas de rendimiento horribles cuando se habla con el dispositivo USB.

La segunda aplicación es mucho más grande y no he intentado construir y ejecutar aún debido al temor a problemas de arquitectura. Esta aplicación tiene un número de 64 bits solo módulos (psycopg2 para uno) utilizados en él. Me gustaría evitar intentar construir esto si imposible para ejecutarse como un ejecutable de 32 bits.

Pensamientos actuales
siento que esto podría ser posible (si los módulos cuentan con el apoyo de 32 bits) mediante la ejecución del build.py con Python forzado en modo de 32 bits. ¿Tiene esto algún sentido?

actualización
Tenía varios avances en el primer programa que estaba construyendo. Resulta que los problemas de rendimiento se basaron únicamente en la velocidad de las dos máquinas. Mi máquina de desarrollo 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 lo hizo.

Resolví este problema al modificar la forma en que sondeé el puerto USB. Ahora que esto se solucionó, podría ejecutar el exe en ambos sistemas. Un nuevo problema surgió al intentar construir el ejecutable como un solo archivo. Al ejecutar Build.py de pyinstaller, extrae todas las DLL necesarias que la aplicación necesita para ejecutarse. Esto pareció funcionar muy bien al principio, pero cuando traté de ejecutar el único exe que construí en Windows 7 64 bits, no se ejecutaría en Windows XP porque la DLL del dongle USB no se reconocía como una DLL válida.

Para poder ejecutar el único exe en ambos sistemas, primero traté de eliminar la DLL del archivo .spec (que parece ser un script de python). Fue conveniente porque pude modificar la lista de incluye antes del comando de compilación con modificadores de lista de Python normales. Mi esperanza era que si el DLL no se encontraba en el directorio temporal del exe lo encontraría en el sistema PATH. Si bien este enfoque podría funcionar, no podría hacerlo funcionar sin lanzar muchos errores.

Mi segundo intento fue construir la aplicación en la máquina con Windows XP (dejando la DLL incrustada) con la esperanza de que la DLL Win XP 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 anterior que se ejecuta en un sistema operativo más nuevo.

+2

Sé que tiene una solución de trabajo, pero ¿intentó instalar Python de 32 bits en la máquina Win7 y usar eso para ejecutar build.py? Tendría que instalar todas las dependencias de 32 bits también, pero eso debería capturar las DLL correctas de 32 bits. (Por otro lado, puede que no funcione si necesita soportar XP.) – Velociraptors

+0

@Velociraptors: La única DLL que pareció entender que no la quería era la DLL para el dongle USB. El software de este dispositivo es de 32 bits solamente, así que estoy empezando a pensar que el controlador también tenía 32 bits. Entonces, en este caso, creo que fue un problema de incompatibilidad de controlador de 7 frente a XP. –

Respuesta

7

Si está creando una aplicación y funciona bien 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é es WOW64?

Si necesita utilizar una biblioteca o una característica que es solo de 64 bits, solo cree una versión de 64 bits. No tiene sentido crear 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 y 32 bits, es aprovechar el mayor espacio de direcciones de las ventanas de 64 bits. Es decir. si tiene la intención de 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 limitaciones de la plataforma, pero edite imágenes más grandes o grandes cantidades de datos en plataformas de 64 bits.

IOW, para su caso siga la sugerencia de @Velociraptors y construya en python de 32 bits si está construyendo un exe de 32 bits.

+2

Lo siento por un retraso tan largo en una respuesta. Estoy de acuerdo con usted en el hecho de que si no se necesitan 64 bits, no lo use. Sin embargo, si estoy ejecutando Windows 7 64 bit y 64 bit Python, ¿cómo puedo crear una versión de 32 bits? Esa es la verdadera pregunta aquí. –

+0

@AdamLewis, también instala Python de 32 bits y haz que tu compilación-script genere ambos ejecutables. – Ben

10

Pyinstaller produce un binario que depende de la python que utilizó para construirlo. Entonces, si usa Python 2.7 de 64 bits, no es posible, hasta donde yo sé, producir un ejecutable de 32 bits. 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, crear binarios de 32 bits. Probablemente pueda especificar más su pregunta.

Cuestiones relacionadas