Kommando wiederholen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Gast

Donnerstag 5. Januar 2006, 12:46

Klingt ziemlich einfach, darum suche ich auch nach einer möglicht einfachen Lösung.

Möchte mein Kommando immer in gewissen Abständen wiederholen, also z.B.
print "my commando"
soll alle 10 Minuten selbstständig wiederholt werden.

Danke!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 5. Januar 2006, 12:59

Du baust dir einen kleinen Timer, der alle 10*60 Sekunden einen Befehl per subprocess ausführt. Kein Problem. Zeig mal deinen Code, wie weit du bist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 5. Januar 2006, 13:42

Anonymous hat geschrieben:Möchte mein Kommando immer in gewissen Abständen wiederholen, also z.B. print "my commando" soll alle 10 Minuten selbstständig wiederholt werden.
Hi!

Mit "sleep" vom "time"-Modul kannst du dein Programm eine kurze Zeit warten lassen.

Code: Alles auswählen

import time

for i in range(10):
    print "Hallo"
    time.sleep(2)
Allerdings wartet dabei dein Programm komplett. Es reagiert in dieser Zeit auf nichts. Wenn du mehr haben willst, dann musst du mit Threads arbeiten oder wie schon von Leonidas aufgezeigt, einen anderen Prozess starten, der deine Aktionen durchführt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 909
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Donnerstag 5. Januar 2006, 13:59

Hi,
ungefähr so:

Code: Alles auswählen

import gobject
import popen2
import subprocess

startbefehl = "myprog.exe"
frequenz = 10 * 60000
gobject.timeout_add(frequenz, subprocess.Popen(startbefehl))
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 5. Januar 2006, 20:00

Hallo Damaskus!

Dein Programm ist zwar ganz nett, nur ist popen2 darin unnötig und gobject wird nicht jeder haben, da gobject ein Modul von PyGTK ist (allerdings habe ich mir auch bei der Frage des OP gedacht, dass das ein Fall für timeout_add() wäre :) )
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Damaskus
Administrator
Beiträge: 909
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Freitag 6. Januar 2006, 11:44

Stimmt...
War halt auf die schnelle aus nem anderen Script rauskopiert.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Freitag 6. Januar 2006, 14:03

help(sched)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 6. Januar 2006, 15:54

blackbird hat geschrieben:help(sched)
Hi blackbird!

Nicht schlecht dieses "sched". Super Hinweis! Das kannte ich noch nicht oder ist mir zumindest beim Überfliegen der Module noch nie aufgefallen. :mrgreen:

http://docs.python.org/lib/module-sched.html

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Gast

Montag 9. Januar 2006, 12:36

Also das ist das was ich bis jetzt habe:

Code: Alles auswählen

import sched, time
import thread

s=sched.scheduler(time.time, time.sleep)

def print_time(): print "3 seconds"

def print_some_times():   
    s.enter(3, 1, print_time, ())
    s.run()
       
i= 0
while i == 0:
    thread.start_new(print_some_times, ())
    time.sleep(3)

print "goes along"
Bis zum print "goes along" komm ich aber nicht.
Muss jetzt den thread im Hinterground laufen lassen, oder?
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

Montag 9. Januar 2006, 13:54

Ganz klar das du nicht bis zum goes along kommst.


Das liegt an der while schleife!
Die termininiert nicht, d.h. nirgends wird das i auf != 0 gesetzt!
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 9. Januar 2006, 14:06

Code: Alles auswählen

import sched, time

sch=sched.scheduler(time.time, time.sleep)

def print_time(suff): 
    print time.time(), suff
    
sch.enter(3, 1, print_time, ("Start nach 3 sec.",))
sch.enter(6, 1, print_time, ("Start nach 6 sec.",))
sch.run()

print "Ende"
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Gast

Montag 9. Januar 2006, 14:59

mr.hide hat geschrieben:Ganz klar das du nicht bis zum goes along kommst.


Das liegt an der while schleife!
Die termininiert nicht, d.h. nirgends wird das i auf != 0 gesetzt!
Das stimmt schon, aber ich möchte ja auch, dass mein Thread solange weiterläuft, bis mein Programm beendet wird. Ich müsste also meine while-Schleife irgendwie als Hintergrundprozess laufen lassen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 9. Januar 2006, 15:45

Code: Alles auswählen

import time
import thread
import threading


def print_time(suff, e):
    for i in range(5):
        print time.time(), suff
        time.sleep(2)
    e.set()

e1 = threading.Event()
e2 = threading.Event()
e1.clear()
e2.clear()

time.sleep(3)
thread.start_new(print_time, ("Start nach 3 sec.", e1))
time.sleep(3)
thread.start_new(print_time, ("Start nach 6 sec.", e2))

print "Warte auf Event 1"
e1.wait()
print "Warte auf Event 2"
e2.wait()

print "Ende" 
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 9. Januar 2006, 15:49

Anonymous hat geschrieben:aber ich möchte ja auch, dass mein Thread solange weiterläuft, bis mein Programm beendet wird. Ich müsste also meine while-Schleife irgendwie als Hintergrundprozess laufen lassen.

Code: Alles auswählen

import time
import thread
import threading

def print_time(abbruch_event):
    while True:
        print time.time()
        time.sleep(1)
        if abbruch_event.isSet():
            break

abbruch_event = threading.Event()
thread.start_new(print_time, (abbruch_event,))
time.sleep(10)
abbruch_event.set()

print "Ende" 
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Gast

Montag 9. Januar 2006, 16:07

also das klappt schon mal ganz gut so, danke schonmal.

Mein Hauptproblem ist aber immernoch, dass ich den Thread nicht im Hintergrund laufen lassen kann. Also ich möchte, dass print "Ende" erreicht wird und mein thread trotzdem noch weiterläuft.

Also ich möchte meinen Thread im kompletten Programm im Hintergrund ständig laufen lassen und gleichzeitig den Rest des Programms ungestört weiterlaufen lassen.

Meine Ausgabe soll also in deinem Beispiel ungefähr so aussehen:

1136818813.88 Start nach 3 sec.
1136818815.88 Start nach 3 sec.
Warte auf Event 1
1136818816.88 Start nach 6 sec.
1136818817.88 Start nach 3 sec.
1136818818.88 Start nach 6 sec.
Ende
1136818819.88 Start nach 3 sec.
1136818820.88 Start nach 6 sec.
1136818821.88 Start nach 3 sec.
1136818822.88 Start nach 6 sec.
Warte auf Event 2
1136818824.88 Start nach 6 sec.
...
...
Antworten