2008-11-14 7 views
16

Ist es möglich, dass ein Python-Skript seine eigene Quelldatei öffnet und sie überschreibt?Kann ein laufendes Python-Programm sich selbst überschreiben?

Die Idee war, einen sehr einfachen und sehr schmutzigen Weg für ein Python-Skript zu haben, um ein Update von sich selbst herunterzuladen, so dass es das nächste Mal, wenn es ausgeführt wird, eine aktualisierte Version wäre.

Antwort

21

Das ist sicherlich möglich. Nachdem das Skript geladen/importiert wurde, greift der Python-Interpreter nicht mehr darauf zu, außer beim Drucken der Quellzeile in einer Ausnahmestapel-Ablaufverfolgung. Jede Pyc-Datei wird beim nächsten Mal neu generiert, da die Quelldatei neuer ist als die Pyc-Datei.

+0

cool ... ich dachte, es war nicht wegen eines Fehlers ich bekam, aber ich sehe jetzt, es war ein dummer Fehler, den ich machte. – carrier

+0

Hinweis: Wenn Sie die .py-Datei entfernen, aber die .pyc-Datei beibehalten, wird diese Datei möglicherweise noch importiert. Beißt mich mindestens einmal im Monat. –

8

Eigentlich ist es vorzuziehen, dass Ihre Anwendung mit einem Dummy-Checker-Downloader startet, der sich selten (wenn überhaupt) ändert; vor der Ausführung sollte überprüft werden, ob Updates verfügbar sind. Wenn ja, dann würde es sie herunterladen (normalerweise würde der Rest der App Module sein) und dann importieren Sie sie und starten Sie die App.

Auf diese Weise, sobald Updates verfügbar sind, starten Sie die Anwendung und wird die neueste Version ausführen; Andernfalls ist ein Neustart der Anwendung erforderlich.

+0

Ich werde es wahrscheinlich so implementieren. Vielen Dank. – carrier

11

Wenn Sie den Großteil des Codes in ein Modul eingeben, können Sie die Hauptdatei (die ausgeführt wird) den Speicherort des Updates überprüfen und automatisch die neueste Version herunterladen und installieren, bevor das Modul installiert ist importiert.

Auf diese Weise müssen Sie die Anwendung nicht neu starten, um die neueste Version auszuführen, importieren Sie das Modul einfach neu.

Sie können die Funktion reload() verwenden, um ein Modul zum erneuten Laden der Daten zu zwingen. Beachten Sie, dass es einige Vorbehalte gibt: Objekte, die mit Klassen in diesem Modul erstellt wurden, werden nicht magisch auf die neue Version aktualisiert, und "vom Modul importieren Zeug" vor dem Reimport kann dazu führen, dass "Zeug" auf das alte Objekt "module.stuff" verweist ".

[klar, dass ich nicht die früheren Post deutlich genug lesen - es tut genau das, was ich vorschlagen]

+0

Ja, aber Ihre Antwort ist viel gründlicher, so dass es eine Abstimmung wert ist :) – tzot

+0

Ich mag die Idee, aber es funktioniert nicht auf Systemen, auf denen Sie keine Module installieren können. – sorin

+0

Sie können den PYTHONPATH immer ändern, um ein Verzeichnis einzubinden: alle Dateien/Ordner gibt es dann Python-Module. –

1

Vielleicht wollen Sie auch dieses Modul überprüfen (die in 2,5 & 3 als auch)

http://www.python.org/doc/2.1.3/lib/os-process.html

Insbesondere die execv Methode wird den aktuellen Prozess überschreiben mit dem, was Sie von dieser Methode aufrufen. Ich habe einige Tests gemacht und es funktioniert ziemlich zuverlässig.