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!
Kommando wiederholen
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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 (former) Modvoice
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi!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.
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)
mfg
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- Damaskus
- Administrator
- Beiträge: 999
- Registriert: Sonntag 6. März 2005, 20:08
- Wohnort: Schwabenländle
Hi,
ungefähr so:
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))
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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
)
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 (former) Modvoice
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi blackbird!blackbird hat geschrieben:help(sched)
Nicht schlecht dieses "sched". Super Hinweis! Das kannte ich noch nicht oder ist mir zumindest beim Überfliegen der Module noch nie aufgefallen.

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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Also das ist das was ich bis jetzt habe:
Bis zum print "goes along" komm ich aber nicht.
Muss jetzt den thread im Hinterground laufen lassen, oder?
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"
Muss jetzt den thread im Hinterground laufen lassen, oder?
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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.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!
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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.
...
...
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.
...
...
z.B.: so?
- Natürlich kanns du die beiden letzten Zeilen auskommentieren, aber dann hast du ne Endlosschleife 
Geht natürlich auch noch anders.
Aber hiermit erschaffst du eine Klasse die als neuer Prozess läuft.
Dadurch terminiert sie nicht wenn das Programm das Sie startet zu Ende ist. Ausser du setzt es als Deamon.
Code: Alles auswählen
import threading
import time
class OwnThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
print "Ich bin ein eigener Prozess"
def run(self):
while not abbruch_event.isSet():
print "laufe noch"
time.sleep(2)
abbruch_event = threading.Event()
t = OwnThread()
t.start()
print "Ich bin schon fertig, warte noch und schliesse dann den Thread"
time.sleep(4)
abbruch_event.set()

Geht natürlich auch noch anders.
Aber hiermit erschaffst du eine Klasse die als neuer Prozess läuft.
Dadurch terminiert sie nicht wenn das Programm das Sie startet zu Ende ist. Ausser du setzt es als Deamon.
Grüße
Matthias
- Fluchen befreit von Kummer und Leid -
Matthias
- Fluchen befreit von Kummer und Leid -
Ach ja, so sieht jetzt übrigens mein Programmteil aus, falls es jemanden interessiert:
Code: Alles auswählen
import threading
import time
class MyRegularThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
sleep_time = 60
i = 1
while i == 1:
print "does anything"
time.sleep(sleep_time)
t = MyRegularThread()
t.start()
Jo, habs jetzt noch ein bisschen verändert und erweitert - klappt wunderbar!
Danke für eure Hilfe!
Danke für eure Hilfe!
Code: Alles auswählen
import threading
import time
class MyRegularThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
global abbruch_event
abbruch_event = threading.Event()
def run(self):
sleep_time = 2
while not abbruch_event.isSet():
print "does anything"
time.sleep(sleep_time)
def close(self):
abbruch_event.set()
class MyMainProgram:
def begin_MyRegularThread(self):
t = MyRegularThread()
t.start()
def close_MyRegularThread(self):
t = MyRegularThread()
t.close()
def somethingElse(self):
print "does something else"
do = MyMainProgram()
do.begin_MyRegularThread()
do.somethingElse()
time.sleep(10)
do.close_MyRegularThread()