web-dev-qa-db-fra.com

Puis-je contrôler l'architecture (32 bits contre 64 bits) lors de la construction d'un exécutable pyinstaller?

Question courte
Existe-t-il un moyen de contrôler/garantir l'architecture (32 bits contre 64 bits) lors de la construction d'un exécutable pyinstaller?

Contexte
J'ai migré de py2exe vers pyinstaller en raison du manque de prise en charge 64 bits ainsi que d'une multitude de petites choses que j'ai du mal à regarder au-delà. Donc sur cette note, je préférerais pas pour y revenir. J'ai développé deux applications à l'aide de Python 2,7 64 bits et j'ai des problèmes de performances lors de leur exécution sur des machines 32 bits.

Le premier est une interface graphique wxPython simple (version 2.9) et se connecte à un fichier Windows DLL pour un pilote USB. Celui-ci semble assez "sûr" pour fonctionner en 32 bits car il n'y a pas de modules qui ne sont que 64 bits. Cependant, cette application lors de l'exécution sur Windows 32 bits XP a des problèmes de performances horribles lors de la conversation avec le périphérique USB.

La deuxième application est beaucoup plus grande et je n'ai pas encore essayé de la construire et de l'exécuter à cause de la peur des problèmes d'architecture. Cette application a un certain nombre de modules 64 bits uniquement (psycopg2 pour un) utilisés. Je voudrais éviter d'essayer de construire ceci si cela impossible pour fonctionner comme un exécutable 32 bits.

Réflexions actuelles
Je pense que cela pourrait être possible (si les modules prennent en charge 32 bits) en exécutant le build.py avec Python forcé en mode 32 bits. Est-ce que cela a un sens?

Mise à jour
J'ai fait plusieurs percées dans le premier programme que je construisais. Il s'avère que les problèmes de performances étaient uniquement basés sur la vitesse des deux machines. Ma machine de développement avait suffisamment de puissance pour interroger le périphérique USB assez rapidement et la plate-forme de test beaucoup plus lente (Windows XP) n'en avait pas.

J'ai résolu ce problème en modifiant la façon dont j'ai interrogé le port USB. Maintenant que cela a été corrigé, je pouvais exécuter l'exe sur les deux systèmes. Un nouveau problème était survenu lors de la tentative de création de l'exécutable en tant que fichier unique. Lors de l'exécution de Build.py de pyinstaller, il récupère toutes les DLL requises que l'application doit exécuter. Cela semblait très bien fonctionner au début, mais lorsque j'ai essayé d'exécuter le seul exe que j'ai construit sur Windows 7 64 bits, il ne fonctionnerait pas sur Windows XP parce que le DLL du dongle USB était non reconnu comme DLL valide.

Afin de faire fonctionner l'exe unique sur les deux systèmes, j'ai d'abord essayé de supprimer le DLL du fichier .spec (qui semble être un script python). C'était pratique car j'ai pu modifier la liste des inclusions avant la commande build avec des modificateurs de liste python ordinaires. J'espérais que si le DLL n'était pas trouvé dans le répertoire temporaire de l'exe, il le trouverait sur le système PATH. Bien que cette approche pourrait fonctionner, je ne pouvais pas la faire fonctionner sans lancer beaucoup d'erreurs.

Ma deuxième tentative a été de construire l'application sur la machine Windows XP (en laissant la DLL intégrée) dans l'espoir que la Win XP DLL fonctionnerait dans Windows 7. Succès! Cette configuration fonctionne bien; Cependant, je crois fermement que ce n'est pas la meilleure solution car cela dépend uniquement de l'ancien DLL fonctionnant sur un système d'exploitation plus récent.

30
Adam Lewis

Pyinstaller produit un binaire en fonction du python que vous avez utilisé pour le construire. Donc, si vous utilisez python 2,7 64 bits, ce n'est pas possible, pour autant que je sache) , pour produire un exécutable 32 bits, car Pyinstaller archive tous les modules et leurs dépendances (dlls, pyds etc.) qui sont 64 bits en raison de l'installation python.

Comme déjà dit, il est préférable, en raison de problèmes de compatibilité croisée, de créer des binaires 32 bits. Vous pouvez probablement préciser davantage votre question.

11
J_Zar

Si vous créez une application et qu'elle fonctionne correctement sous Windows 32 bits, il n'est pas nécessaire de créer une version 64 bits. Créez simplement une version 32 bits et exécutez-la sur les deux architectures. À quoi sert le WOW64.

Si vous devez utiliser une bibliothèque ou une fonctionnalité 64 bits uniquement, créez simplement une version 64 bits. Il est inutile de créer une version 32 bits si la fonctionnalité est uniquement 64 bits.

La seule raison de construire une version 64 bits et une version 32 bits est de profiter de l'espace d'adressage accru des fenêtres 64 bits. C'est à dire. si vous avez l'intention d'allouer plus de 1 ou 2 Go de mémoire. Un exemple peut être une application d'édition d'image ou une application de manipulation de données. Vous pouvez ensuite exécuter sur des plates-formes 32 bits dans les limites de la plate-forme, mais modifier des images plus grandes ou de plus grandes quantités de données sur des plates-formes 64 bits.

IOW, pour votre cas, suivez la suggestion de @Velociraptors et construisez en 32 bits python si vous construisez un exe 32 bits.

7
Ben