web-dev-qa-db-fra.com

Réduire la taille de pyinstaller exe

J'ai un simple pyas pyinstaller exe qui fait plus de 40MB.

Mon exemple exe:

import collections
import csv
import Selenium
import pandas

print('hi')

40 Mo + pour cela semble un peu exagéré.

Comment puis-je réduire cela autant que possible?

Une méthode:

pyinstaller --onefile --exclude matplotlib --exclude scipy --exclude pandas --exclude numpy.py

Cela n’est toutefois pas pratique compte tenu de la taille de la liste d’exclusion.

Comment sélectionner un dossier pour pyinstaller afin d'extraire les modules et d'exclure tout le reste afin d'avoir une petite application?

Fichier de spécification:

a = Analysis(['123.py'],
             pathex=['C:\\Users\\AA\\ZZ'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='123',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )

Cela vaut également la peine d'être mentionné. Par défaut, Pyinstaller ne détecte pas les pandas. 

Ajouter:

hiddenimports = ['pandas._libs.tslibs.timedeltas']

To: C:\Users\<NAME>\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyInstaller\hooks

Une solution possible lors de l'utilisation de plusieurs exécutables pourrait consister à lier chaque exécutable à un dossier distinct ou à un exécutable avec toutes les importations. 

15
user9062171

essayez de configurer votre environnement avec virtualenv, et n'y installez que les bibliothèques requises

voici quelques détails sur l'utilisation de l'environnement virtuel virtuel: https://virtualenv.pypa.io/en/stable/

8
Ophir Yoktan

Je pense que ces deux réponses sont excellentes.

Pour moi, c’est un cas simple d’utilisation de pandas dont l’exe est énorme. 

Supprimer certains répertoires a été utile, tout comme UPXING, qui a également beaucoup aidé. 

Je l'ai eu beaucoup réduit et ce n'était pas le cas par défaut. 

Cela étant dit, on parle ici de la solution finale la plus importée: Importer des modules Python à partir d’un emplacement de choix . Donc, il y avait une fonctionnalité qui faisait tout cela, mais pour l'instant il y a un peu de manipulation manuelle impliquée parce que: les paquets multi-paquets sont cassés.

Passons maintenant à la solution simple pour beaucoup d'exécutifs

Si vous avez plusieurs exécutables, je recommande fortement cette approche:

pyinstaller -F abc.py --onedir (Have all imports of both scripts)
pyinstaller -F abd.py --onedir (Have all imports of both scripts)

Maintenant, mettez abd.exe dans le seul répertoire du dossier abc.py, ainsi que dans tout autre script externe. Assurez-vous qu'ils portent un nom différent ou qu'un seul script sera exécuté.

Cela fonctionne vraiment bien car toutes les dépendances sont dans un dossier. Ça devrait être comme cela. Dans cet exemple, disons que vous avez un dossier de 40 Mo. Après chaque fichier EXE supplémentaire, il ne fera que + 5 Mo (ou la taille du fichier Exe) plutôt que 40 Mo chacun. 

5
user9062171

L'interpréteur python et tous les modules importés sont inclus dans l'exécutable.

Vous pouvez essayer d'ajouter les modules que vous souhaitez exclure à la liste excludes sous Analysis dans votre fichier de spécifications.

Vous pouvez également essayer de compresser l'exécutable en utilisant UPX. Voir Note sur l’utilisation de UPX

0
Aaron Garton