Hallo Leute,
ich überlege gerade, wie ich es am besten umsetze. Meine Idee geht dort hin, dass ich eine Zeit festlege, und das Skript dann zu den gegebenen Zeiten ausgeführt wird. Optionen wäre zum Beispiel: mache alle Minuten was, mache jede Stunden, jeden Tag, an jedem zweiten Tag, jeden Freitag, jede Woche, jeden Monat... etc. Wenn ich also sage, mache jeden Freitag um 13 Uhr Etwas, dann soll das Skript dies ausführen. Nicht vorher, und nicht nachher. Und das ganze am besten plattformunabhängig.
Mein erster Gedanke war das time-Modul, insbesondere an time.sleep(x). Aber ich denke, dazu ist das Modul nicht zuverlässig, oder? Denn je nach dem wie lange ein bestimmter Prozess braucht, kann es sich auch zeitlich verschieben. Als Beispiel, wenn ich möchte, dass jede Minute Etwas gemacht werden soll, und die Prozedur braucht rund eine halbe Minute, dann setzt der Intervall nicht nach einer Minute wieder an, sondern erst nach 1,5 Minuten.
Gibt es Beispiele zu meinem Anliegen? Damit ich es durchstudieren kann? Welche Module wären da besser?
Bleiben wir bei dem Freitag um 13 Uhr. Ich glaube, allein dies umzusetzen könnte ich mir schon recht kompliziert vorstellen. Oder ist es "leichter" als es klingt?
Mach' Etwas in einem Intervall
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Nun es gibt schedule, das das schon erledigt: https://github.com/dbader/schedule
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Ich weiss nicht genau, was du mit "crontab" meinst, aber "cron" ist der Unix Standardscheduler und dessen Konfigurationsdatei heisst "crontab".
Ja `schedule` ist plattformunabhaengig, es benutzt den `time.sleep` den du verworfen hast, allerdings unterstuetzt durch `datetime`.
Ja `schedule` ist plattformunabhaengig, es benutzt den `time.sleep` den du verworfen hast, allerdings unterstuetzt durch `datetime`.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Was ich mit crontab meinte, ist dies hier. Ich schau mir gerade das Video dort an. Nur muss ich noch herausfinden, ob dieses Modul das macht, was ich mir vorstelle. Aber Schedule werde ich mir auch ansehen.
Windows hat den Task Scheduler, OS X hat launchd und Unixiode Systeme haben cron und systemd. Unabhängig davon gibt es auch noch Task Queues wie celery die sowas auch können.
Das Rad hier komplett neuzuerfinden macht keinen Sinn, die Wahrscheinlichkeit dass du (oder irgendjemand anders) etwas besseres produziert ist gering und lernen dürfte man dabei auch nicht viel außer frustrierender Kram über Zeit, Zeitzonen usw. Selbst wenn deine Lösung gut oder besser als die existierenden wäre, dürfte es schwer sein andere davon zu überzeugen. Das einzige was interessant sein könnte wäre eine Library zu schreiben die platformspezifische Lösungen abstrahiert, gibt es aber wahrscheinlich auch schon und kenne ich nur nicht.
Das Rad hier komplett neuzuerfinden macht keinen Sinn, die Wahrscheinlichkeit dass du (oder irgendjemand anders) etwas besseres produziert ist gering und lernen dürfte man dabei auch nicht viel außer frustrierender Kram über Zeit, Zeitzonen usw. Selbst wenn deine Lösung gut oder besser als die existierenden wäre, dürfte es schwer sein andere davon zu überzeugen. Das einzige was interessant sein könnte wäre eine Library zu schreiben die platformspezifische Lösungen abstrahiert, gibt es aber wahrscheinlich auch schon und kenne ich nur nicht.
@DasIch: Das Rad möchte ich auf keinen Fall neu erfinden. Deswegen suche ich ja Mittel und Wege. Vielleicht habe ich mich am Anfang etwas unglücklich ausgedrückt. Ich möchte einfach einen Weg finden, indem ich eine beliebige Zeit festlege und das Skript dann dies ausführt. Wie man "einfache" Zeiten abarbeiten, wie "Mache alle zwei Minuten Etwas" ist ja kein Thema. Aber was ist, wenn ich mir einen Zeitplan anlege, und das Skript soll dann nach diesem angegebenen Zeitplan arbeiten. Das war eher so meine Grundidee.
Naja, dann ist die Antwort recht einfach: Sowas macht man nicht. Du schreibst ein Skript dass alle X irgendwas ausgeführt werden soll und dann konfigurierst du ein separates Programm wie z.B. cron dies zu tun.
Ausnahme sind Situationen in denen X recht klein wird z.B. wenn du jede Minute etwas tust. Dann macht es wenig Sinn ständig einen neuen Prozess starten zu lassen und man nutzt einfach eine Schleife und time.sleep().
Ausnahme sind Situationen in denen X recht klein wird z.B. wenn du jede Minute etwas tust. Dann macht es wenig Sinn ständig einen neuen Prozess starten zu lassen und man nutzt einfach eine Schleife und time.sleep().
@DasIch: Meine Absicht geht dorthin, dass ich in meinem Programm ein Update eingerichtet habe. Du kennst sicherlich solche Update-Einstellungen wie "Automatisch prüfen", "manuell prüfen" oder "prüfen nach Zeitplan". Bei "automatisch prüfen" schaut mein Programm kurz auf meinem Update-Server, ob ein Update vorliegt. Zum Beispiel, jedesmal wenn das Programm gestartet wird. Aber ich kann ja auch "manuell prüfen", indem ich nach meinem Belieben nach Updates schaue. Und wenn ich einen Zeitplan festlegen will, zum Beispiel "Jeden Freitag um 13 Uhr nach Updates schauen". Deswegen schaue ich nach solch einen Weg, dass mein Skript dies erledigt.
Das ändert nichts an dem was ich gesagt hab. Du hast deinen Updater und den startest du einfach über cron o.ä.
Davon mal unabhängig: Einen automatischen Update Mechanismus richtig zu implementieren ist sehr schwer. Wie verhinderst du dass ein Angreifer Updates einschleusst? Was wenn ein fehlerhaftes Update veröffentlicht wird? Was wenn der Updatevorgang fehlschlägt? All dies sind Fragen auf die man eine sehr gute Antwort haben sollte. Wenn man die nicht hat, sollte man es besser bei einer Benachrichtigung des Users belassen und diesen manuell ein Update ausführen lassen. Davon unabhängig ist ein solcher Mechanismus natürlich unter Betriebssystemen mit Paketmanagern vollkommen inakzeptabel.
Davon mal unabhängig: Einen automatischen Update Mechanismus richtig zu implementieren ist sehr schwer. Wie verhinderst du dass ein Angreifer Updates einschleusst? Was wenn ein fehlerhaftes Update veröffentlicht wird? Was wenn der Updatevorgang fehlschlägt? All dies sind Fragen auf die man eine sehr gute Antwort haben sollte. Wenn man die nicht hat, sollte man es besser bei einer Benachrichtigung des Users belassen und diesen manuell ein Update ausführen lassen. Davon unabhängig ist ein solcher Mechanismus natürlich unter Betriebssystemen mit Paketmanagern vollkommen inakzeptabel.