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
Projekt weitergeben
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
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.
When we say computer, we mean the electronic computer.
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.
Vielen Dank und viele Grüße.
snowflake
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')
snowflake
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
Eventuell so:
Das sollte laut Doku mit Tree() klappen.
Code: Alles auswählen
....
exe = EXE(pyz,
a.scripts,
Tree('..D:\\pfad\\bilder', prefix='bilder\\'),
.....
When we say computer, we mean the electronic computer.
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
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
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
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?
When we say computer, we mean the electronic computer.
Guten Abend sls,
Du hast natürlich recht. Ich hätte gleich sollen die Informationen beifügen.
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
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')
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
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
Probiere vielleicht mal aus, dass du den absoluten Pfad zu einem File angibst. Und lass die Tree-Option nochmal weg.
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\\irgendeinfile.txt", "irgendeinfile.txt")]
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")]
When we say computer, we mean the electronic computer.
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
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
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
@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.
__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.
When we say computer, we mean the electronic computer.
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
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
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
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
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
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.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?
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.
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.
When we say computer, we mean the electronic computer.