2013-04-03 9 views
6

Ich verwalte ein internes Python-Paket, das von einigen nicht wirklich technischen Leuten im Unternehmen benutzt wird. Da sich ihre Bedürfnisse (oder besser gesagt, ihre Wünsche) fast täglich ändern, muss ich die Bibliothek ziemlich oft aktualisieren und ich erstelle ihnen zu oft neue Installer für ihren Geschmack.Ist es möglich, ein Python-Paket im laufenden Betrieb zu aktualisieren?

Die Bibliothek bietet einen High-Level-Zugriff auf eine benutzerdefinierte Inhouse-Datenbank. An diesem Punkt weiß ich, dass ich die lib-Version zusammen mit der Abfrageanforderung senden und dem Benutzer eine Nachricht mit dem Ergebnis anzeigen kann, dass sie ein Update installieren müssen.

Allerdings scheinen diese Leute zu denken, dass es einige Sekunden dauert, auf eine EXE-Datei zu klicken und durch Klicken auf die "Weiter" -Schaltflächen des Installationsprogramms zu lange dauert. Ich werde gefragt, ob es eine gibt Möglichkeit, die Bibliothek automatisch zu aktualisieren, wenn sie den Aufruf "X importieren" ausführen.

Ich bin nie auf diese Art von Anfrage gestoßen, und ich denke, wenn das möglich wäre, würden die meisten populären Bibliotheken diese Option anbieten. Aber ich habe mich schon oft geirrt. Hat jemand das schon einmal erfolgreich gemacht?

+0

Ich habe das in der Vergangenheit erfolgreich gesehen, für genau die Gründe, die Sie beschreiben. Es ist nicht schwer, aber ich kann mir keine Out-of-the-Box-Lösung für Python-Module vorstellen. (+1) – NPE

+2

Ich sehe nicht, warum Sie nicht alle Dateien herunterladen können, kopieren Sie sie an Ort und rufen Sie 'reload()' auf dem Modul ... Aber ich glaube wirklich nicht, dass es eine gute Idee ist. Was ist, wenn es ein Update gibt, das alles kaputt macht? Die Leute könnten nicht verhindern, dass ihre Systeme durch das automatische Upgrade beschädigt werden. Wenn sie so schnell Updates benötigen, können sie nicht direkt von einem Zweig im Repo aus arbeiten, den Sie verwenden, anstatt ein Installationsprogramm zu verwenden? Dann können sie sinken, wann immer sie wollen. Oder sie könnten natürlich weniger faul sein. (^_^) – Cartroo

+1

@Cartroo: Ich denke nicht, dass Bruch ein Problem ist. Schließlich kann ein Installer auch alles kaputt machen. –

Antwort

2

Ich entschuldige mich, wenn dies nur ein Kommentar ist.
Aber es gibt ein paar Möglichkeiten, denke ich. Und ich muss Cartroo zustimmen, eine reload() Funktion könnte ausreichen.

Es gibt einen großen Artikel auf this (Charming Python: Reloading on the fly) Website. Ich bin mir nicht ganz sicher, ob dies genau das ist, wonach Sie suchen, aber das Beispiel in dem Artikel scheint Ihren Bedürfnissen ziemlich genau zu entsprechen.

Lasst uns ein Szenario für diesen Artikel malen: Angenommen, Sie ein Prozess auf dem lokalen Computer ausgeführt werden soll, sondern ein Teil Ihrer Programmlogik lebt woanders . Nehmen wir an, dass diese Programmlogik von Zeit zu Zeit aktualisiert wird, und wenn Sie Ihren Prozess ausführen, möchten Sie gerne die aktuellste Programmlogik verwenden. Es gibt eine Anzahl von Ansätzen, um die gerade beschriebene Anforderung zu erfüllen; Dieser Artikel führt Sie durch mehrere von ihnen.

1

Lassen Sie den "Import X" -Aufruf einen Code in einer Wrapper-Bibliothek ausführen. Der Code zum Zeitpunkt des Imports überprüft die Datenbank auf eine neue Version der Bibliothek und lädt sie herunter, wenn sie sich geändert hat. Dann kann es wiederum die heruntergeladene Bibliothek importieren oder die vorhandene Bibliothek importieren. Es könnte Probleme mit dem eingefrorenen Code geben, so dass Sie das neue Modul möglicherweise explizit überprüfen müssen.

Bearbeiten: Dies muss nicht unbedingt in einem anderen Modul erfolgen. Es könnte nur ein Funktionsaufruf sein.

Verwandte Themen