Python Script andere Uhrzeit vorgaukeln

jb_alvarado

Lieutenant
Registriert
Sep. 2015
Beiträge
609
Hallo Allerseits,
ich habe ein Script was endlos läuft und immer zu einer definierten Zeit eine Aufgabe aktualisiert (z.B. um 00:00:00). Für die Zeitberechnung greift das Script auf datetime zurück.

Zum Debuggen bräuchte ich die Möglichkeit dem Script eine andere Uhrzeit vorzugaukeln. Per VM oder Container das zu bewerkstelligen ist mir etwas zu sperrig, weil ich sehr häufig die Uhrzeit anpassen müsste. Am liebsten wäre mir eine Art Umgebungsvariable, wo ich bei jedem Scriptstart die Zeit zurücksetzen kann.

In das Script etwas hart rein programmieren möchte ich auch nicht, weil ich nicht möchte, dass diese Anpassung ins Git Repo gelangt.

Habt ihr hier Ideen zu, wie ich das machen könnte?
 
Die aufgerufen datetime Funktion mocken.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Hayda Ministral, jb_alvarado, up.whatever und eine weitere Person
schreib ein batch/ps/ script das die uhrzeit anpasst und danach auf automatisch zurückstellt?
 
Zum Testen die Zeit auf einen Defaultwert stellen.
zum Beispiel aktuelle_Zeit=08:00:00
 
  • Gefällt mir
Reaktionen: M4ttX
Die Uhrzeit per Parameter an das Skript übergeben und, wenn der Parameter gesetzt ist, diese Zeit statt datetime verwenden.
 
  • Gefällt mir
Reaktionen: Der Lord, mercury, Bemme90 und 2 andere
  • Gefällt mir
Reaktionen: stevefrogs
burglar225 schrieb:
Die Uhrzeit per Parameter an das Skript übergeben und, wenn der Parameter gesetzt ist, diese Zeit statt datetime verwenden.

Alternativ, einen kurzen parameter übergeben (zB nur ein buchstabe). spart tipp arbeit, wenn die ewig gleiche Uhrzeit sonst reicht.
kann man ja mit einer if sys.argv[1] Abfrage einfach triggern und dann die defaultzeit einfügen.
 
  • Gefällt mir
Reaktionen: mibbio
Ich danke euch für die vielen Antworten und Gedankenanregungen! Habe mich für den Ansatz von @M4ttX entschieden. Kannte die Mock-Methode noch gar nicht... Dazu gibt es auch passend für datetime ein Modul: freezgun, was für mich genau passt. Das gute dabei ist auch, dass es auch die Uhrzeit vom Logging Modul überschreibt, man muss nur beachten, dass die Zeit in UTC übergeben werden muss.

Habe mir jetzt ein Testscript geschrieben, wo ich mein eigentliches Script importiere, und mit einer anderen Zeit ausführe:

Python:
#!/usr/bin/env python3

import datetime
import os
import sys

from freezegun import freeze_time

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from ffplayout.output import desktop

if __name__ == '__main__':
    freezer = freeze_time("2021-02-09 00:00:00")
    freezer.start()
    assert datetime.datetime.now() == datetime.datetime(2021, 2, 9, 0, 0, 0)

    desktop.output()
    freezer.stop()

Edit: Ähm, ich war wohl doch etwas zu schnell... freezgun tut die Zeit komplett einfrieren, also die bleibt einfach stehen... Das brauche ich natürlich nicht :-)
 
  • Gefällt mir
Reaktionen: M4ttX
keep it simple:

Python:
import sys
import datetime

if 'd' in sys.argv[1:]:
    myTime = datetime.datetime(2000, 1, 1, 08, 00)
       
else:
    myTime = datetime.datetime.now()

starte mit
Code:
python .\myscript.py d
 
Zuletzt bearbeitet:
So simple ist das ja auch nicht, weil ich dann einen flachen Zeitspempel vom logging Modul bekomme.

Im Grunde wäre es schon am besten, wenn ich datetime überschreibe.
Ergänzung ()

Habe jetzt time_machine gefunden, damit geht es.

Python:
import time_machine

german_tz = ZoneInfo("Europe/Berlin")
source_time = [2021, 2, 8, 23, 0, 0]


@time_machine.travel(datetime.datetime(*source_time, tzinfo=german_tz))
def run_in_time_machine():
    assert datetime.datetime.now() == datetime.datetime(*source_time)
    run_my_script()


if __name__ == '__main__':
    run_in_time_machine()
 
Zuletzt bearbeitet:
Mit mock.patch() kannst du die Funktion auch selbst überschreiben
 

Ähnliche Themen

Zurück
Oben