Seite 1 von 1
Projekt weitergeben
Verfasst: Dienstag 25. September 2018, 13:44
von snowflake
Hallo zusammen,
mein Projekt besteht aus mehreren Python-Skripten, die teilweise als Modul eingebunden werden. Neben der Standardbibliothek verwende ich auch andere Bibliotheken, die über PIP installiert wurden (z. B. OpenPyXL). Zum Projekt gehören auch viele Bilder (*.png), Text- und Exceldateien (*.xlsx). Auf meinem Rechner, auf dem Python nebst Bibliotheken installiert ist, funktioniert es. Jetzt möchte ich das Projekt auf anderen Rechnern ausführen, auf denen kein Python installiert ist und auch nicht installiert werden soll.
Welche Möglichkeiten gibt es das Projekt auf anderen Computern auszuführen (entweder durch Integration von Python oder als Binärdateien)?
Packen könnte man dann die Dateien und Ordner mit 7-Zip als ausführbare Datei.
Vielen Dank und viele sonnige Grüße.
snowflake
Re: Projekt weitergeben
Verfasst: Dienstag 25. September 2018, 18:12
von sls
Da würde ich mir wohl mal py2exe anschauen, ich gehe einfach mal davon aus dass du dein Programm auf Windows-Rechnern ausrollen möchtest. Afaik kann man Python mit allen notwendigen Abhängigkeiten kompilieren und samt deiner App als .exe bundlen.
Re: Projekt weitergeben
Verfasst: Freitag 28. September 2018, 13:18
von snowflake
Hallo,
mit py2exe hat es nicht funktioniert. Kam immer eine Fehlermeldung.
Mit
pyinstaller klappt es wunderbar, allerdings werden Verzeichnisse mit möglicherweise darin befindlichen Dateien nicht übernommen. Kann mir jemand sagen wie ich die folgende spec-Datei ergänzen muss, damit auch Unterverzeichnisse mit aufgenommen werden? Ich finde einfach keinen Ansatz dafür.
Code: Alles auswählen
# -*- mode: python -*-
block_cipher = None
a = Analysis(['D:\\ver\\verwalt_29.pyw',],
binaries=[],
datas=[('*.txt','.'), ('*.xlsx','.'),('*.png','.'),('*.db','.'),('*.ico','.'),('*.lnk','.'),],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='verwalt',
debug=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='verwalt')
Vielen Dank und viele Grüße.
snowflake
Re: Projekt weitergeben
Verfasst: Freitag 28. September 2018, 20:08
von sls
Eventuell so:
Code: Alles auswählen
....
exe = EXE(pyz,
a.scripts,
Tree('..D:\\pfad\\bilder', prefix='bilder\\'),
.....
Das sollte laut Doku mit Tree() klappen.
Re: Projekt weitergeben
Verfasst: Samstag 29. September 2018, 08:58
von snowflake
Hallo sls,
hab's gerade versucht, geht nicht. Kommt eine Fehlermeldung.
FileNotFoundError: [WinError 3] Das System kann den angegebenen Pfad nicht finden: 'Berichte\\'
Hast Du noch eine Idee woran es liegen könnte?
Viele Grüße
snowflake
Re: Projekt weitergeben
Verfasst: Samstag 29. September 2018, 09:08
von sls
Bitte dazu die Config posten, damit man sieht an welcher Stelle du das eingetragen hast, und vor allem was. Wann tritt der Fehler auf? Wenn du versuchst das Paket zu bauen?
Re: Projekt weitergeben
Verfasst: Samstag 29. September 2018, 19:33
von snowflake
Guten Abend sls,
Du hast natürlich recht. Ich hätte gleich sollen die Informationen beifügen.
Code: Alles auswählen
# -*- mode: python -*-
block_cipher = None
a = Analysis(['D:\\Daten\\System\\Python\\Notenverwaltung\\Notenverwaltung_30.pyw',],
binaries=[],
datas=[('*.txt','.'), ('*.xlsx','.'),('*.png','.'),('*.db','.'),('*.ico','.'),('*.lnk','.'),('*.dat','.'),],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
Tree('D:\\Daten\\System\\Python\\Notenverwaltung\\Berichte', prefix='Berichte\\'),
exclude_binaries=True,
name='Notenverwaltung_30',
debug=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='Notenverwaltung_30')
Mit diesem Skript kommt keine Fehlermeldung, allerdings fehlt der Ordner
Berichte im Unterordner
dist.
Hab auch die folgende Zeile versucht:
Tree('..D:\\Daten\\System\\Python\\Notenverwaltung\\Berichte', prefix='Berichte\\'),
Hier die Fehlermeldung:
OSError: [WinError 123] Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch: '..D:\\Daten\\System\\Python\\Notenverwaltung\\Berichte'
Vielen Dank und einen schönen Abend.
snowflake
Re: Projekt weitergeben
Verfasst: Samstag 29. September 2018, 19:56
von sls
Probiere vielleicht mal aus, dass du den absoluten Pfad zu einem File angibst. Und lass die Tree-Option nochmal weg.
Code: Alles auswählen
datas=[("D:\\Daten\\System\\Python\\Notenverwaltung\\Berichte\\irgendeinfile.txt", "irgendeinfile.txt")]
Bei dem ganzen Zauber ist `datas` eine Liste von Tupeln, das erste Element eines Tuples ist der Pfad zur Datei, das zweite Element der Name der Datei.
Wenn das klappt, kannst du nochmal probieren ob es mit einem ganzen Ordner klappt.
Code: Alles auswählen
datas=[("D:\\Daten\\System\\Python\\Notenverwaltung\\Berichte", "Berichte")]
Re: Projekt weitergeben
Verfasst: Samstag 29. September 2018, 20:15
von __deets__
Das sieht nach einem Pfadproblem aus. Es ist eh ungewöhnlich, absolute Pfade zu benuzten. Benutz doch mal relative.
Re: Projekt weitergeben
Verfasst: Sonntag 30. September 2018, 17:36
von snowflake
Hallo sls, hallo __deets__,
vielen Dank für Eure Unterstützung. Es funktioniert jetzt. So sieht die spec-Datei aus:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['D:\\Daten\\System\\Python\\Notenverwaltung\\Notenverwaltung_31.pyw',],
binaries=[],
datas=[('*.txt','.'), ('*.xlsx','.'),('*.png','.'),('*.db','.'),('*.ico','.'),('*.lnk','.'),('*.dat','.'),
("D:\\Daten\\System\\Python\\Notenverwaltung\\Berichte", "Berichte"),
("D:\\Daten\\System\\Python\\Notenverwaltung\\DB-Sicherungskopien", "DB-Sicherungskopien")],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='Notenverwaltung_31',
debug=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='Notenverwaltung_31')
Wenn es jetzt nicht geklappt hätte, hätte ich die Dateien im Anschluss von Hand hinein kopieren müssen. So ist es aber wesentlich eleganter und man kann es nicht vergessen.
Nochmals vielen Dank und viele Grüße.
snowflake
Re: Projekt weitergeben
Verfasst: Sonntag 30. September 2018, 18:03
von sls
@snowflake: *so* wie du es jetzt angegeben hast, ergibt das für mich aber keinen Sinn. Evtl. habe ich in der Doku was übersehen, aber die Angabe der Dateiendungen hat eigentlich keinen Effekt, funktioniert es auch, wenn du diese weglässt?
__deets__ hat hier nicht unrecht, die absolute Pfadangabe war ja erstmal zu Debugging-Zwecken gedacht. Ich würde jetzt zusehen, dass ich den Pfad zu den Ordnern die eingebunden werden sollen, relativ zur Spec-Datei bzw. dem Ort wo du das pyinstaller-Script/Kommando ausführst, liegen, definiere.
Re: Projekt weitergeben
Verfasst: Montag 1. Oktober 2018, 07:31
von snowflake
Hallo sls,
meinst Du ich sollte die komplette Zeile hier weglassen und es sollte immer noch funktionieren?
datas=[('*.txt','.'), ('*.xlsx','.'),('*.png','.'),('*.db','.'),('*.ico','.'),('*.lnk','.'),('*.dat','.'),
Woher weiß dann Pyinstaller was es alles in den dist-Ordner packen soll?
Wie kann ich relative Bezüge angeben?
Viele Grüße
snowflake
Re: Projekt weitergeben
Verfasst: Montag 1. Oktober 2018, 14:22
von snowflake
Hallo,
ich habe gerade festgestellt, dass die Ordner Berichte und DB-Sicherungskopien nur mit kopiert werden in den Ordner dist, wenn sich auch darin mindestens eine Datei befindet. D. h., sind die Ordner leer werden sie auch nicht mit kopiert.
VG snowflake
Re: Projekt weitergeben
Verfasst: Montag 1. Oktober 2018, 17:53
von sls
snowflake hat geschrieben: Montag 1. Oktober 2018, 07:31
meinst Du ich sollte die komplette Zeile hier weglassen und es sollte immer noch funktionieren?
datas=[('*.txt','.'), ('*.xlsx','.'),('*.png','.'),('*.db','.'),('*.ico','.'),('*.lnk','.'),('*.dat','.'),
Woher weiß dann Pyinstaller was es alles in den
dist-Ordner packen soll?
Nochmal. datas repräsentiert eine Liste, dessen einzelne Inhalte jeweils Tuple () sind. Das erste Element eines Tuples gibt den Pfad zur Datei / Ordner an, das zweite Element den Namen der Datei / Ordner. In deinem Beispiel würde ich das so interpretieren: alle Dateien mit der jeweiligen Endung im aktuellen Verzeichnis. Dafür steht zumindest in der Linux/Unix-Welt der Punkt.
Das bedeutet, wenn dein Spec-File nicht im selben Ordner wohnt, in dem auch die ganzen Dateien mit der o.g. Endung liegen, werden diese nicht eingebunden. Daher sollte es funktionieren, wenn du das einfach weglässt und den relativen Pfad zur Ressource angibst, sowie den Ordner den du einbinden möchtest. Dabei wird ja sowieso alles eingebunden was im Ordner ist. Probier's einfach mal aus.
snowflake hat geschrieben: Montag 1. Oktober 2018, 07:31
Wie kann ich relative Bezüge angeben?
In dem du den Pfad relativ zum Spec-Script bzw. dem Ort wo du den Build-Process durchführst angibst. Als Beispiel:
Deine Spec-Datei liegt hier:
D:\\Daten\\System\\Python\\spec-file.py
Dann würdest du den relativen Pfad so angeben:
Notenverwaltung\\Berichte"
Relativ bedeutet ja "relativ zu dem Ort wo man gerade ist". Ob die Schreibweise bei Windows so richtig ist, weiß ich nicht genau. Das ist besser, weil du beim Ändern von Pfaden auch dein Spec-File anpassen müsstest. Gibst du eine Applikation an andere weiter, stimmen bei ihnen möglicherweise die Pfade auch nicht, da sie eine andere Pfadstruktur haben können.