Skript das Anwendung immer um 18Uhr startet?

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.
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Hallo ,
ist es möglich ein Skript unter Windows zu programmieren
dass eine gegebene Anwendung immer um 18UHr startet?
Wenn ja ...könnte mir jemand ein wenig helfen ich bin da etwas ueberfordert...

Danke
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hallo,
wie wäre es denn mit dem Taskplaner ?

Gruß, Whitie
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Möchtest du mit einem Script, externe Anwendungen ab einer bestimmten Uhrzeit starten oder Möchtest du dass im Script ab einer bestimmten Uhrzeit eine Funktion ausführt?

Für ersteres wäre der Taskplaner tatsächlich besser (wozu das rad neu erfinden, es sei den es ist Bestandteil deines Programms).

Für das Zweite weiß ich keine Absolut gute lössung aber Spontan würde mir folgendes einfallen:

Du, machst dir erstmal eine while schleife die unendlich läuft und als Abbruchbedingung zb. ein bestimmtes Wort hat das du übergeben kannst. So, nun brauchst du die Funktion time aus der Library time (also time.time()), das dir, richtig formatiert, die aktuelle Uhrzeit in einer Variablen Speichert. Mit einer if abfrage fragst du dann mit der Variablen ab, ob die von dir gewünschte Uhrzeit erreicht ist. Wenn ja dann wird halt Funktion XYZ ausgeführt ;) Das ganze kannst du natürlich auch dazu benutzen um ein Programm auszuführen. :)

Ich schreib mal nachher ein kleines Beispiele Script.

lg
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Hallo, danke für eure rege Hilfe
also das skript wird einmal gestartet und läuft immer...und es soll z.B einfach um 18 Uhr nur unter windows z.b winamp starten....

was ist denn ein taskplaner ? :)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Code: Alles auswählen

import time
 
tm = time.strftime("%H:%M:%S", time.localtime() )
print tm
x=0
while True:
    tm = time.strftime("%H:%M:%S", time.localtime() )
    if tm == "11:23:30":
        print "es ist %s uhr" %tm
        break
    
    ####
    # Dieser abschnitt ist eine Vorsichtsmaßname,
    # damit das ganze nicht in einer Endlosschleife endet ^^
    #
    if x == 1000000: 
        print "Vorzeitiger Abbruch" 
        break
    x += 1
    #
    #
    ####
Naja...

Allso das if x == 1000000: habe ich jetzt eingebaut damit es nicht in einer Endlosschleife endet ;) Egal, das beispiel sol ja nur zu dienen wie das gehen könnte.

Zeile 7 hohlt die aktuelle Uhrzeit. In Zeile 8 wird dann überprüft ob die Uhrzeit die gewünscht ist und führt dann das nachfolgende aus. in diesem Fall findet hier nur ein print statt und beendet die schleife. Dort könnte man jetzt ein Programm starten, oder ne Funktion ausführen oder sonstwas.


Naja, das Problem ist aber nun das man das Programm auch irgendwie beenden können muss. Ich weiß leider nicht wie man mit python shortcuts definieren kann auf das dann das script reagiert. :oops: Deshalb habe ich oben auch eine Abbruchbedingung definiert damit es nicht in einer Endlosschleife endet :oops: ^^

Falls du das Script ausprobieren willst, muss du un Zeile 8 eine gewünschte Uhrzeit angeben und dann Zeile 16-18 löschen ^^

BTW: Falls einer weiß wie man shortcuts definieren kann in Python dann bitte posten. Würde mich jetzt auch interessieren, dann kann ich mal aus dem Beispielskript ein vernümftiges machen ;)

lg
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Mati hat geschrieben:[...]
was ist denn ein taskplaner ? :)
das ist Bestandteil von Windows und damit kann man halt Tasks palnen. Also einstellen das zur eine bestimmten Uhrzeit ein Programm ausgeführt wird z.B. ;)

EDIT:
Mir Fällt gerade ein, das es besser wäre so was in einen eigenen thread zu packen. Also in einem thread läuft dann die while schleife mit den rest ab und in einem anderen halt der Rest der Applikation, damit das Programm noch reagieren kann und nicht von der Endlosschleife blockiert wird ;)
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

danke :)

ehm wo starte ich jetzt die anwendung?
irgendwie über system() ?

jetzt muss ich nur noch herausfinden wie ich daas bewerkstellige mit dem thread....*grmpf
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Im Modul os gibt es z.B. den befehl execl, execle usw. mit den man ein Programm starten kann. (Kuck mal mit pydoc welcher für dich in frage kommt. Hab dafür bis her keine Verwendung gehabt und daher weiß ich ich nicht welcher der passende wäre)

Aber mal was wichtiges: Es muss aber eine Abbruchbedingungen herrschen in der schleife, damit es nicht ins endlose läuft. Das heißt konkret, das man per taste zb. Strg+C drückt und das das Script erkännt und dann die schleife beendet. Leider weiß ich nicht wie man so was realisiert.

Und dann was ganz wichtiges: Das script von mir ist anscheinend nicht zu gebrauchen!! Ich habs noch mal laufen lassen und bemerke gerade das die while schleife die ganze Prozessorlast beansprucht (100%) :oops: Aus irgendwelchen grund zeiht das soviel :( Sorry, ich wusste nicht das eine while schleife soviel Performance beansprucht. Naja, deshalb ist mein Ansatz nicht zu gebrauchen :(

Aber nun hast du mich auf eine gute Idee gebracht und will es nun auch wissen wie man das lösen kann :D

Ich mache mich mal daran das web zu durchsuchen xD

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

Mati hat geschrieben:eine gegebene Anwendung immer um 18UHr startet?
Hallo Mati!

Verwende den Taskplaner (Geplante Tasks) aus der Systemsteuerung.

Wenn das Python-Programm ständig läuft und von sich heraus den Job automatisch ausführen soll, dann kannst du auch mit dem "sched"-Modul etwas anfangen.

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

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi gerold.
Hab das gerade getestet und das läuft super :)

Sry für OT. aber weißt du weshalb eine while schleife soviel Performance beansprucht? Irgendwie müssen die das im sched Modul auch mit einer schleife realisiert haben oder hängt es davon ab was genau die schleife macht? In meine oberen Beispiel wird da ja nur addiert und das kann doch nicht soviel Performance kosten oder :?

lg
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Vorweg: Ich habe den Eindruck, dass der Taskplaner fuer Matis Vorhaben doch ganz gut geeignet ist.
XtraNine hat geschrieben:Und dann was ganz wichtiges: Das script von mir ist anscheinend nicht zu gebrauchen!! Ich habs noch mal laufen lassen und bemerke gerade das die while schleife die ganze Prozessorlast beansprucht (100%)
Man sollte in die while-Schleife noch ein time.sleep(...) einbauen. Und in jedem Fall bei der Abbruchbedinung keine '=='-Abfrage machen, sondern pruefen, ob der angegebene Zeitpunkt schon verstrichen ist, fuer den Fall, dass man den Zeitpunkt, dass es genau 18:00:00 Uhr ist, verpasst. So in etwa:

Code: Alles auswählen

while time.strftime("%H:%M%S", time.localtime()) < '18:00:00':
    time.sleep(1)
Kann man natuerlich noch anpassen, je nachdem, wie genau man die Zeitabfrage braucht.

Edit: Man, habe ich lange fuer dieses Posting gebraucht...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

XtraNine hat geschrieben:In meine oberen Beispiel wird da ja nur addiert und das kann doch nicht soviel Performance kosten oder?
Hi XtraNine!

Wenn du dem Computer sagst, dass er etwas tun soll, dann tut er es. Und das so schnell wie möglich. Wenn du ihm in einer Schleife sagst, dass er etwas tun soll, dann tut er das, was du ihm gesagt hast, so schnell wie möglich und ständig.

Nur, wenn du dem Computer mal zwischendurch eine Pause gönnst (time.sleep()), dann wird er zwischendurch mal unterbrechen.

Ständig am Werkeln:

Code: Alles auswählen

while True:
    print "Hallo"
Bei jedem Durchlauf eine halbe Sekunde Pause:

Code: Alles auswählen

while True:
    print "Hallo"
    time.sleep(0.5)
``sched`` macht intern wahrscheinlich auch nichts anderes, als in einer Schleife kurz zu warten, prüfen ob die Zeit reif ist und dann mit der Schleife weiter zu machen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Ach ja *ich mich auf den Kopf klatsch*, Mensch stimmt ja, hast ja recht. Man muss den ja auch ne kurze pause gönnen, damit er nicht die ganze rechen zeit "klaut".

thx & lg xtra

P.S.: So, nun muss ich nur noch was finden, womit man Tastenkombinationen im script registrieren kann, damit das script darauf reagieren kann, um eine Abbruchbedingung für die while schleife zu haben. Dan habe ich schon mal ein shedluer, der auch auf Uhrzeiten reagieren kann und nicht nur auf clocks:)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

hi Rebecca.

Hab erst gerade dein Post gelesen. Super Idee! :)

thx & lg xtra
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Zufälligerweise hab ich auch mal sowas gebraucht. bei mir wird ne Wavedatei abgespielt, aber das kannst Du ja Deinen Erfordernissen anpassen.

Code: Alles auswählen

import time
import winsound

def gettime():
	YYYY,MM,DD,hh,mm,ss,dw,dy,x = time.localtime()
	# kommentar
	if ss == int(0) and mm == int(0) and hh == int(12) and dw < 4:
		winsound.PlaySound("c:\scripts\SPEECH\Pause.wav",0)		
	if ss == int(0) and mm == int(15) and hh == int(9):
		winsound.PlaySound("c:\scripts\SPEECH\SpielUnterbrochen.WAV",0)

print "Pause-Script started!"
while 1:
	time.sleep(0.8)
	gettime()
Das Script spielt Montag bis Freitag um 9.15 den einen Sound ab und Montag bis Donnerstag einen anderen. Brauch ich für meine Geschäftspausen :D

Gruß
alpha
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich versteh irgendwie immer noch nicht, warum hier so eine Abneigung gegenüber dem Taskplaner (oder so sachen wie cron) herrscht. Sämltliche hier gezeigten Programme ließen sich viel eleganter mit dem Taskplaner/Cron lösen.
Always use the right tool for the task.

P.S.: Prozesse würde ich über das Modul Subprocess starten, das nur so nebenbei.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Wenn das Script in der Wartezeit keine Funktion erfüllt außer zu warten, braucht man doch gar keine While-Schleife. Man berechnet die Differenz x zwischen aktueller Zeit und gewünschter Startzeit und wartet die Zeit mit sleep(x).
MfG
HWK
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

@Leonidas
Wir sind aber ein Pythonforum.. also lösen wir alles mit Python :D
.. und wenns nur aus Spass ist :wink:
alpha
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

alpha hat geschrieben:Wir sind aber ein Pythonforum.. also lösen wir alles mit Python :D
.. und wenns nur aus Spass ist :wink:
Ich bevorzuge saubere, wenn auch in diesem Fall nicht-pythonische Lösungen. Ich kann zwar deinen Punkt verstehen, aber das Rad neu erfinden finde ich eben nicht so wahnsinnig interessant und wenig zielführend (klar, manchmal ist sowas auch nötig).

Was aber praktisch ist:
Wenn man ein Programm hat und in diesem etwas um eine bestimmte Uhrzeit passiert, was mit dem programm auch zu tun hat. Zum Beispiel dass ein Programm das die Fahrpläne der öffentlichen Verkehrsmittel an bestimmten Uhrzeiten Meldungen bingt, dass bald die letzte Verbindung der Linie X abgeht. Aber um einfach so andere Programme zu starten -> cron. Läuft sowieso immer und verschwendet daher nicht unnötige Prozessorzyklen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Leonidas hat geschrieben:[...]
Was aber praktisch ist:
Wenn man ein Programm hat und in diesem etwas um eine bestimmte Uhrzeit passiert, was mit dem programm auch zu tun hat. Zum Beispiel dass ein Programm das die Fahrpläne der öffentlichen Verkehrsmittel an bestimmten Uhrzeiten Meldungen bingt, dass bald die letzte Verbindung der Linie X abgeht. Aber um einfach so andere Programme zu starten -> cron. Läuft sowieso immer und verschwendet daher nicht unnötige Prozessorzyklen.
Genua so sehe ich das auch :) Daher finde ich das auch interessant, einen guten Lösungsansatzes dafür zu haben. Um Programme oder Scripte zu starten braucht man sowas wirklich nicht --> TM oder das von dir angesprochene cron.

Aber wie du shcon sagst: Sobald man diese Funktionalität für interen vorgänge im script braucht, ist es schon nicht schlecht wenn man weiß wie man sowas macht :) Ich bin ja auch zwar ein vertrete davon das man das rad nicht neu erfinden soll, aber oft will ich doch gerne wissen wie man sowas realisiert.

BTW: Danke für den tipp mit Subprocess. Werde mir das mal ansehen und ich glaube ich muss mal langsam anfange alle Docstrings von alle Modulen zu lesen, damit ich weiß was Python so alles als Standard so bietet :) Aber die Liebe Zeit :-[...

BTW2: Passend zum Thema: Bin immer noch der Überzeugung, das diese schleife mit sleep, abfrage, etc besser in einen eigenen thread rein sollte, damit es nicht das ganze Programm blockiert. Also praktisch einen Thread für die Hauptaufgaben die immer bereit stehen müssen und dann einen für diese abfrage die im Hintergrund läut und dann bei erreichter Zeit irgendwas macht.
Antworten