2017-12-07 5 views
7

Ich habe eine einfache pandas pyinstaller exe, die über 40MB ist.Größe der pyinstaller exe reduzieren

My exe Beispiel:

import collections 
import csv 
import selenium 
import pandas 

print('hi') 

40MB + hierfür scheint ein bisschen ü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 praktisch, wenn man bedenkt, wie groß die Ausschlussliste wäre.

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

Spec-Datei:

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.

Anzahl:

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

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

Eine mögliche solution wenn mehrere ausführbare Dateien verwenden, könnte jede ausführbare Datei in einen separaten Ordner zu verknüpfen oder ausführbare Datei mit allen Importen.

+0

Wenn Sie die Abhängigkeiten entfernen, wird die Exe nicht in der Lage sein, Ihr Skript auszuführen, oder fehlt mir etwas? –

+1

@FlorentB. Pyinstaller verpackt andere Dinge, die nicht benötigt werden. Auch 40mb für diese exe? Ich habe versucht, es zu UPX, aber es ändert sich nicht viel für mich. Muss es falsch machen. –

+0

Wenn ich 'pyinstaller --onefile test.py' (test.py enthält Ihr Beispiel), bekomme ich eine ausführbare Datei, die etwa 5 MB ist. –

Antwort

3

versuchen, Ihre Umgebung mit einem virtualenv einrichten und installieren dort sind nur die benötigten Bibliotheken

einige Details über die Arbeit mit virtuellen env hier: https://virtualenv.pypa.io/en/stable/

+0

Ich zögere, dies zu tun, da ich kürzlich mein gesamtes Betriebssystem wegen Dateibeschädigungsproblemen und Python neu installieren musste. Ist das sicher? Ich werde sehen, wie das in einer virtuellen Box geht. –

+1

ja - es ist etwas wie eine Python-Virtualbox - alle Pakete sind in einem separaten virtuellen env installiert und haben keine Auswirkungen auf die Python-Hauptinstallation. entfernen Sie es nur ein Verzeichnis löschen, und Sie können mehrere Virtualvalensvs mit verschiedenen Kombinationen von Bibliotheken und Versionen –

+0

Ich bin nicht vertraut mit virtuellen Umgebungen, aber ich muss sein. Die Verwendung von pyinstaller auf einer virtuellen Box verursacht Probleme. Vielleicht wird ein virtuelles env behoben. –

0

Der Python-Interpreter und alle importierten Module in enthalten sind die ausführbare Datei.

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

Sie könnten auch versuchen, die ausführbare Datei mit UPX zu komprimieren. Siehe A note on using UPX

+0

Ist es nicht Upx standardmäßig? Ich habe eine große Anzahl von auszuschließenden Modulen also wahrscheinlich nicht ideal. Es gibt keinen Ausschluss für alle Module außer für ein bestimmtes Verzeichnis. –

+0

Ich dachte, es wurde automatisch upxed, mein Fehler. Etwas wie: pyinstaller -F -upx-dir C: \ Benutzer \ DD \ Downloads \ upx394w \ upx394w \ 123 \ upx308w \ upx.exe zz.spec funktioniert jedoch nicht. –

3

Ich fühle mich wie diese beiden Antworten sind hervorragend.

Für mich ist es ein einfacher Fall von Pandas, dass die exe ist riesig.

Obwohl das Entfernen bestimmter Verzeichnisse hilfreich war, half UPXING auch sehr.

Ich habe es sehr reduziert und es tat dies nicht standardmäßig.

Das heißt, die endgültige und wichtigste Lösung wird hier diskutiert: Importing Python modules from a select location. Es gab also ein Feature, das all dies getan hat, aber im Moment gibt es eine manuelle Handhabung, weil: multipackage-bundles defekt ist.

nun auf die einfache Lösung für viele exe

Wenn Sie viele ausführbare Dateien, ich diesen Ansatz sehr empfehlen:

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

Jetzt setzen abd.exe in ein Verzeichnis von abc.py Ordner sowie alle anderen externen Skripte. Stellen Sie sicher, dass sie unterschiedlich benannt sind oder nur ein Skript ausgeführt wird.

Dies funktioniert wirklich gut, da alle Abhängigkeiten in einem Ordner sind. So sollte es sein. In diesem Beispiel haben Sie also einen 40-MB-Ordner. Für jede weitere exe danach wird es nur + 5mb (oder wie groß die exe ist) und nicht mehr als 40mb.

Verwandte Themen