Python Programm updaten

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
Scyks
User
Beiträge: 17
Registriert: Freitag 3. August 2007, 09:03

Hey,

ich hab schon ein bischen gegoogelt zu diesem Thema aber nicht wirklich was gefunden.

Ich würde gerne ein Programm, was ich geschrieben habe, updaten und zwar mit einer update funktion intern. Also man klickt einen Button und denn wird gecheckt obs ne neue Version gibt und die wird dann runtergeladen und installiert.

Soweit zur Theorie, ich denke mal das es in Python funktioniert, nur wie sieht es aus wenn das ganze ding als *.exe läuft und unter Mac OSX als *.app

Könnt ihr mir eventuell weiterhelfen wie man sowas aufbaut, vllt hat jemand ein Script. Wie mach ich das mit den Versionen, damit das Programm weiß das ein neues Release vorhanden ist.

Wie führe ich das Updaten selbst aus. Soll ja aus dem Programm heraus geschehen.

Wäre echt super wenn ihr mit Tipps gebt wie man sowas am sinnvollsten und besten löst.

Vielen Dank schonmal im Vorraus :)

Grüße

Scyks
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Heyho,

meistens funktionieren "Updates" so, dass ein Service oder ein seperates Updatetool den eigentlichen Vorgang der Aktualisierung vornehmen.

Man kann es z.B. so gestallten, dass die Hauptanwendung selbst die Updateprüfungen (manuell oder auch schedulled) und den Download durchführt, dann einen Updater startet, sich beendet und das so eben gestartete Tool seine Arbeit verrichten lässt.

Da die eigentliche Anwendung erst beendet sein muss, bevor der Updateprozess vollführt werden sollte (darf), muss der Updater entweder zeitlich verzögert die Aktualisierung ausführen (unsicher) oder besser auf die "Beendigung" der Hauptanwendung prüfen (aufwendiger, aber zu empfehlen).

---
Edit:

Der Vorteil eines permanent laufenden Updater-Services wäre zudem, dass man im Hintergrund (ohne laufende Hauptanwendung) auf Update-Requirements prüfen und notifizieren kann. Nachteil ist natürlich ein weiterer, Speicher belegender Service mit möglicherweise lästigen und ungewollten Internet-Polls. Soetwas sollte man folglich am besten "konfigurierbar" gestallten.

>>Masaru<<
Scyks
User
Beiträge: 17
Registriert: Freitag 3. August 2007, 09:03

Vielen Dank für deine Antwort Masaru, jedoch stellt sich mir nun die Frage, wie man es hinbekommt aus einem aktuellen Programm ein neues zu öffnen und sich selbst zu beenden, so dass der Update vorgang durchlaufen kann.

Im Prinzip hätte ich dann eine *.exe datei die die Setup routine macht und der kann ich eben die neuen Features mitgeben. das ist ganz plausibel.

Aufm Mac is das aber n bischen anders, da nutze ich ein *.dmg File welches die *.app beinhaltet die man dann von hand in den Applications order legen muss. Wie macht man dies dort? rein theo könnte ich dort über einen prozess die neuen dateien hinkopieren, (kann ich ja bei windows prinzipiell auch :D)

Hmm okay, frage erledigt .....

Ähm, dann zu der nächsten Frage, wie ist denn im Web der beste weg zu prüfen ob ein Update vorhanden ist?

Einfach per directoryListing in einen Ordner springen und nach nem neuen Update Ordner checken?

Habt ihr dazu noch tipps?
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Nächste Frage:
Scyks hat geschrieben:... Ähm, dann zu der nächsten Frage, wie ist denn im Web der beste weg zu prüfen ob ein Update vorhanden ist? ...
... tjoa, nehmen wir einmal an, das Update-Szenario sieht wie folgt aus ...

Ausgangslage:
Du hast lediglich WebSpace und eine dazugehörige URL, die dir zur Verfügung stehen.
(kein eigenständiger Server mit programmierbarer WebServerSoftware, der eine RemoteFunktionalität zur Versionsabfrage oder sogar integriertem FileTransfer bietet)

Zum WebSpace hast du via FTP Zugriff und kannst Unterverzeichnisse anlegen.

URL-Update-Path:
Definiere ein (Unter)Verzeichnis, welches du für Updates deiner Anwendung(en) nutzen möchtest.
  • z.B.: http://...<meine Url>.../ <anwendungsname>/download/
Hier drunter lädst du dann deine Anwendungspakete hoch ... wobei der Grundstamm des Paketes (Executable, Archive, etc.) immer gleich bleibt, lediglich ein Versions-Suffix (Buildnummer, Datum, was du möchtest) sich ändert:
  • z.B.: http://...<meine URL>.../<anwendungsname>/download/myapplication_1.0.zip
Update-Polling:
Nun ist der Zeitpunkt der Clientanwendung gekommen, immer wieder diesen Pfad pollen zu "können". Wie, wann und wodurch dies geschieht, das ist deiner Fantasie überlassen. Ob bei jedem Programmstart, per manuellem User-Anstrubs, etc.

Jedenfalls könntest du z.B: relativ einfach mit der bei Python mitgelieferten urllib2 Bibliothek diesen URL-Pfad prüfen, die Dateinamen aus der HTTP-Response ausparsen und dann die aktuellste Version ermitteln lassen.

Hast du festgestellt, dass eine Datei im URL-Download-Pfad aktueller von der Dateiversion her als deine Software ist, dann kannst du diese auf ähnlichem Wege downloaden und wie bereits erwähnt einen eigenen Updater als seperaten Prozess starten und den eigenen Prozess beenden. Dann hoffst du, dass dieses Tool die Hauptanwendung mit der gedownloadeten neuen Version (oder Patches, etc.) aktualisiert *g*.

Ist die Aktualisierung erfolgreich durchlaufen, könnte der Updater z.B. wiederrum (nach z.B. PopUp Anfrage und Bestätigung seitens des Benutzers) die Hauptanwendung starten und sich final beenden.


Noch vielleicht zwei Tipps:
  • 1. Lass alle Schritte, Fehler und auch erfolgreichen Stati von deinem Updater in Dateilogs schreiben !!!
    2. Backup immer vor dem Update den aktuellen Stand (niemand ist erfreut, wenn einem ein Update die Anwendung oder gar schlimmer die Daten dahinter auf nimmer wiedersehen zerschiesst) !!!
>>Masaru<<
Zuletzt geändert von Masaru am Montag 4. Februar 2008, 12:44, insgesamt 1-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Scyks!

Du kannst z.B. so ein Updateprogramm starten und direkt danach das eigene Programm beenden.

meinprogramm.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import os
import sys
import subprocess
import time

filename = os.path.abspath("updateprogramm.py")
subprocess.Popen([sys.executable, filename])
sys.exit(0)

for i in range(2):
    print "Dieser Code wird nicht mehr ausgefuehrt"
    time.sleep(1)
updateprogramm.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import time

for i in range(3):
    print "Ich bin das Updateprogramm"
    time.sleep(2)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Scyks
User
Beiträge: 17
Registriert: Freitag 3. August 2007, 09:03

Danke für die Antworten,

das klingt alles recht logisch und einfach zu realisieren. Werde mich dann mal hinsetzten und versuchen das zu realisieren.

dürfte ja nicht das problem sein.

Vielen Dank ;)
Antworten