Projekt weitergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

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
Benutzeravatar
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.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

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
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Eventuell so:

Code: Alles auswählen


....
exe = EXE(pyz,
          a.scripts,
	  Tree('..D:\\pfad\\bilder', prefix='bilder\\'),
          .....


Das sollte laut Doku mit Tree() klappen.
When we say computer, we mean the electronic computer.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

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
Benutzeravatar
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.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

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
Benutzeravatar
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.

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")]
When we say computer, we mean the electronic computer.
__deets__
User
Beiträge: 14534
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das sieht nach einem Pfadproblem aus. Es ist eh ungewöhnlich, absolute Pfade zu benuzten. Benutz doch mal relative.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

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
Benutzeravatar
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.
When we say computer, we mean the electronic computer.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

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
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

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
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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.
When we say computer, we mean the electronic computer.
Antworten