ich bin neu hier im Forum, daher eine kurze Vorstellung:
ich habe bereits einige Jahre Erfahrung in der Programmierung mit C++ / Java, andere Programmiersprachen kenne ich eher in der Theorie vom Studium.
Mit Python habe ich erst vor einigen Wochen angefangen und war beeindruckt, wie schnell man vorzeigbare Resultate erzielen kann.
Jedoch hatte ich bisher noch nie das Bedürfnis, ein ausführbares Programm aus Python-Code zu erzeugen... bis Anfang der Woche.
Ich muss sagen, ich war doch sehr irritiert, wie stiefmütterlich (anscheinend?) das Thema "Build-Prozess" seitens Python behandelt wird.
Konkret ist mein "Problem", dass die vom pyinstaller erzeugten Executables (unter Windows10) unverschämt "groß" sind.
Ich habe folgendes Beispiel-Programm, welches sämtliche *.XML-Dateien aus einem Verzeichnis einliest, und ggf. unerwünschte BOM-Werte am Anfang (UTF8-BOM-Codierung) entfernt und die jeweilige Datei ohne BOM zurückschreibt.
Beispiel-Code:
Code: Alles auswählen
import os
import codecs
cur_dir = os.path.dirname(os.path.realpath(__file__))
xmls = []
for f in os.listdir(cur_dir):
if f.endswith(".xml"):
xmls.append(os.path.join(cur_dir,f))
print(len(xmls), "XML files found.")
# Remove BOMs
countBOM = 0
for xml in xmls:
try:
with open(xml, 'r+b') as x:
x.seek(0,2) # seek to end
if x.tell() < 4:
print(xml, " too small.")
else:
x.seek(0,0) # seek to beginning
hasBOM = False
while x.read(3) == codecs.BOM_UTF8:
hasBOM = True
if hasBOM:
countBOM = countBOM + 1
x.seek(-3, 1)
cleanContent = x.read()
x.seek(0,0)
x.write(cleanContent)
x.truncate()
print(xml, " BOM(s) removed.")
except EnvironmentError as ee:
print(xml, " env error: ", ee)
print("Success.", countBOM, "files cleaned.")
Code: Alles auswählen
pyinstaller --onefile removeBOMs.py
Ich habe schon gelesen, dass ich manuell Module ausschließen kann:
Code: Alles auswählen
pyinstaller --exclude-module tkinter --onefile removeBOMs.py
Code: Alles auswählen
pyinstaller --exclude-module tkinter --exclude-module xml --exclude-module datetime --exclude-module _bz2 --exclude-module _hashlib --onefile removeBOMs.py
Ich glaube, ihr versteht, worauf ich hinaus will.
Meine Fragen sind:
1. Gibt es eine Möglichkeit, automatisiert nicht benötigte Module im Build-Prozess auszuschließen, um damit die Größe der Executable zu minimieren?
2. Ist dieser Prozess irgendwo dokumentiert? (bzw. mache ich etwas grundsätzlich falsch?) Denn hier z.B. https://pyinstaller.readthedocs.io/en/s ... -mode.html finde ich den Abschnitt: Analysis: Finding the Files Your Program Needs was allerdings in meinem Fall nicht wie gewünscht zu funktionieren scheint.
3. Könnt ihr mir ggf. eine Alternative zu "pyinstaller" empfehlen?
Ziel wäre es, aus dem obigen Beispielprogramm eine Executable der Größe von maximal 1MB zu erhalten. Dies ist zwar für die Anwendung nicht "kriegsentscheidend", hätte ich aber von einer modernen und vielseitigen Programmiersprache wie Python irgendwie erwartet
Danke für alle Infos und einen schönen Tag zusammen!
Dan