it-swarm.com.de

Pyinstaller exe wird verkleinert

Ich habe einen einfachen Pandas pyinstaller exe, der über 40 MB groß ist.

Mein Exe-Beispiel:

import collections
import csv
import Selenium
import pandas

print('hi')

40MB + für diesen scheint ein wenig übertrieben.

Wie kann ich das so weit wie möglich reduzieren?

Eine Methode:

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

Dies ist jedoch nicht praktikabel, wenn man bedenkt, wie groß die Ausschlussliste wäre.

Wie wähle ich einen Ordner für pyinstaller aus, um Module zu erhalten und alles andere auszuschließen, sodass ich eine kleine Anwendung habe?

Spezifikationsdatei:

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 )

Es ist auch erwähnenswert. Standardmäßig erkennt Pyinstaller keine Pandas. 

Hinzufügen:

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

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

Eine mögliche Lösung bei Verwendung mehrerer ausführbarer Dateien könnte die Verknüpfung jeder ausführbaren Datei mit einem separaten Ordner oder ausführbaren Datei mit allen Importen sein. 

15
user9062171

versuchen Sie, Ihre Umgebung mit einer Virtualenv einzurichten, und installieren Sie dort nur die erforderlichen Bibliotheken

einige Details zur Arbeit mit Virtual Env finden Sie hier: https://virtualenv.pypa.io/de/stable/

8
Ophir Yoktan

Ich finde, dass beide Antworten hervorragend sind.

Für mich ist es ein einfacher Fall, Pandas zu verwenden, dass das Exe riesig ist. 

Das Entfernen bestimmter Verzeichnisse war jedoch hilfreich, ebenso wie UPXING, was auch sehr hilfreich war. 

Ich habe es stark reduziert und dies standardmäßig nicht gemacht. 

Davon abgesehen wird hier über die letzte und meist importierte Lösung gesprochen: Importieren von Python-Modulen von einem ausgewählten Ort . Es gab also eine Funktion, die all dies tat, aber vorerst gibt es einige manuelle Schritte, weil: Multipackage-Bundles defekt sind.

Nun zur einfachen Lösung für viele Exes

Wenn Sie viele ausführbare Dateien haben, empfehle ich diesen Ansatz dringend:

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

Legen Sie nun abd.exe in das eine Verzeichnis des abc.py-Ordners sowie alle anderen externen Skripte. Stellen Sie sicher, dass sie einen anderen Namen haben oder nur ein Skript ausgeführt wird.

Das funktioniert wirklich gut, da sich alle Abhängigkeiten in einem Ordner befinden. So sollte es sein. In diesem Beispiel sagen Sie, Sie hätten einen 40 MB-Ordner. Für jedes weitere Exe danach sind es nur noch +5 MB (oder wie groß das Exe ist) und nicht 40 MB. 

5
user9062171

Ich benutze die Anaconda-Umgebung und daher ist die Virtualenv-Lösung keine Option. Mein Weg war, unnötige Module in meiner Spezifikationsdatei auszuschließen, zB:

in Analyse(...)

excludes=['pandas', 'numpy'],

(Dies sind Module, die die Größe der Dateien außerordentlich erhöhen.)

Für jeden Build verwende ich diese angepasste Spezifikationsdatei, um die Exe zu erstellen.

pyinstaller "mySpec.spec" --distpath="<path>"
0
droebi

Der Python-Interpreter und alle importierten Module sind in der ausführbaren Datei enthalten.

Sie können versuchen, Module, die Sie ausschließen möchten, der Liste excludes unter Analysis in Ihrer Spezifikationsdatei hinzuzufügen.

Sie können auch versuchen, die ausführbare Datei mit UPX zu komprimieren. Siehe Ein Hinweis zur Verwendung von UPX

0
Aaron Garton