time.sleep() notwendig?

  • Hallo,

    ich habe ein paar Fragen zu der Anwendung bzw. Notwendigkeit des Befehls 'time.sleep()' in meinem Quelltext.

    1. Ich möchte über 'Python' deine .log-Datein meines Programms einmal die Woche sichern, indem ich die aktuelle '.log' in einen andern Ordner kopiere und die Quelldatein leere. Das klappt auch ohne Probleme. Nun habe ich zwischen dem Kopieren und dem Leren einen 'time.sleep()'-Befehl von 5 Sekunden gesetzt, da ein Kopiervorgang nicht binnen wenigen Millisekunden abgeschlossen ist. Ist das überhaupt notwenig, oder wartet 'Python' automatisch bis der Kopiervorgang abgeschlosen ist?

    Code
    [...]
       Source = Path + "/data.log"
       Target = Path + "/Log_Data/data.log"
       shutil.copy(Source, Target)
       time.sleep(5)
       data_out = open("data.log", "w")
       data_out.write("")
       data_out.close()
       [...]

    2. Die selbe Frage stellt sich mir bei einer 'Shell' die per 'os.system()' ausgeführt werden soll. Bevor wieder Stimmen laut werden: "Benutze bloß kein 'os.system', dafür gibt es 'subprocess'. Sogar in der offizellen Dokumentation von 'Python' wird davon abgeradet! [...]". Ich habe noch nicht rausgefunden, bzw. mich damit beschäftigt, wie ich folgenden Quelltext mit 'subprocess' ausführe. Bin aber für jede Hilfe dankbar.
    Zweck der 'Shell' ist es zwei Funksteckdosen an/aus zu schalten. Ich weiß halt nur nicht ob der Sender eine Art 'Cooldown' hat oder ob es bei zwei direkt auseinander folgenden Befehlen zu Störungen kommt.

    Bash
    #!/bin/bash
    sudo Software/raspberry-remote/send 11101 2 1
    sleep (5)
    sudo Software/raspberry-remote/send 11101 1 0
    exit 0

    3. Wie ist die Priorisierung bei 'Cronjobs'? Ich möchte minütlich zwei .py-Skripte ausführen die wie in Punkt 2 ggf. einen Befehl an die Funksteckdosen senden. Werden beide Skripte gleichzeitig oder nacheinander, nach Beendigung des vorherigen Skripts augeführt? Ich frage um im schlimmsten Fall, was wie wir wissen immer eintritt, einen gleicxhzeitigen 'send'-Befehl zu vermeiden.

    Vielen Dank im Voraus.
    Gruß Kai

    Einmal editiert, zuletzt von TyRann002 (28. September 2015 um 20:05)

  • Python wird zeilenweise vom Interpreter gelesen, es sei denn Du sagst Python was anderes (z.B. Threading). sleep() ist also unnötig, es sei denn Du steuerts Dinge, über die Du mit Python nach dem anstoßen des Prozesses keine Konrolle mehr hast. Im 2. Script könnte es sein, dass der Sender Zeit zum Umsetzen benötigt, da bekommst Du keine Rückmeldung. Ein sleep kann da nicht schaden.

  • Die Scripts werden von oben nach unten abgearbeitet. Normalerweise wird die nachfolgende Zeile erst dann ausgeführt/verarbeitet wenn die vorherige fertig ist.
    (man kann das aber auch in den Hintergrund schicken, was bei dir aber nicht der Fall ist)

    Bei deinen Python Scripts ist eine Verzögerung bzw blocken/aufhalten nicht notwendig.

    Beim bash Script sieht das nicht anders aus: Dort sollen zwei verschiedene Funksteckdose geschaltet werden -> Die 2. soll eingeschaltet werden, die 1. soll ausgeschaltet werden. Die zweite Zeile wird erst dann ausgeführt wenn die vorherige beendet wurde. Auch hier ist das sleep daher überflüssig.

    In der offiziellen Dokumentation wird nicht von 'subprocess' abgeraten, eher andersrum: es wird in bestimmten Fällen, insbesondere dann wenn man etwas auswerten will, von 'os.system' abgeraten. Kleiner aber feiner Unterschied :fies:
    Für 'subprocess.call' kannste dir merken das du eine Liste (tuple) erstellen musst, für alles was ein Leerzeichen enthält einen eigenen Eintrag. subprocess.call("echo hallo") funktioniert nicht , aber subprocess.call(["echo","hallo"]) sollte gehen.
    Über 'subprocess' kann dann zum Beispiel auch der Exitcode des ausgeführten Befehls ausgewertet werden. 0 sagt: Erfolgreich. Alles über 0 sagt: Fehler. Bezüglich Exitcode siehe auch in den Spoiler'n folgenden Beitrags: > hier <

  • Hallo und vielen Dank.
    Ich werde mein Skript dann dem entsprechend anpassen.

    Wie sieht es mit dem 3. Punkt aus?

    Zitat

    Beim bash Script sieht das nicht anders aus: Dort sollen zwei verschiedene Funksteckdose geschaltet werden -> Die 2. soll eingeschaltet werden, die 1. soll ausgeschaltet werden. Auch hier ist das sleep daher überflüssig.


    Nach dieser Aussage, müsste auch die 'Shell' hinter der vorherigen angestellt werden. Oder wäre es sinniger einfach beide Skript in einen zu verpacken?

    Zitat

    In der offiziellen Dokumentation wird nicht von 'subprocess' abgeraten, eher andersrum: es wird in bestimmten Fällen, insbesondere dann wenn man etwas auswerten will, von 'os.system' abgeraten. Kleiner aber feiner Unterschied


    Da hast du natürlich recht - mein Fehler.
    Ist es denn zwingend notwendig 'os.system' mit 'subprocess' zu ersetzen, oder ist das eher so ein "saubere Programmierung"-Ding?

    Gruß Kai

    • Offizieller Beitrag

    Arbeite von anfang an mit subprocess, wenn du jetzt os.system nimmst, fällt dir im nächsten script auf das du die Rückgaben des Scriptes gerne auswerten möchtest und wechselst dann zu subprocess ;). Ich würde alles in 1. Script packen.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!