threading.Timer NoneType-Problem

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.
Antworten
DANIone
User
Beiträge: 11
Registriert: Sonntag 15. Juni 2008, 19:07
Wohnort: Deutschland

Montag 16. Juni 2008, 20:10

Hallo zusammen:)

Schon wieder ein problem meinerseits und zwar diesmal mit der Timerfunktion!

Man sehe sich dieses einfache Script an:

Code: Alles auswählen

import threading

def hello():
    print "hello, world"

t = threading.Timer(5.0, hello())
t.start()
Das erste Mal schreibt er hello, world aber nach weiteren 5 Sekunden bekomme ich folgende Fehlermeldung:

Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Program Files\Python\lib\threading.py", line 486, in __bootstrap_inner
self.run()
File "C:\Program Files\Python\lib\threading.py", line 663, in run
self.function(*self.args, **self.kwargs)
TypeError: 'NoneType' object is not callable

Ich sehe meinen Fehler einfach nicht!

Danke schonmal für eure Hilfe!
Mr. Kanister
User
Beiträge: 11
Registriert: Montag 16. Juni 2008, 16:45
Wohnort: Bedburg

Montag 16. Juni 2008, 20:17

DANIone hat geschrieben:

Code: Alles auswählen

t = threading.Timer(5.0, hello())
Du musst bei "hello" die Klammern weglassen, da du ja nicht das Ergebnis einer Funktion, sondern eine Referenz auf diese übergeben musst. Dann funktionierts auch ;)

Gruß Martin
LINUX - May the source be with you!
DANIone
User
Beiträge: 11
Registriert: Sonntag 15. Juni 2008, 19:07
Wohnort: Deutschland

Montag 16. Juni 2008, 20:26

Ja das leuchtet ein:)...Dankeschön!

Allerdings gibt es ja jetzt das Problem, dass er nach einmaligem printen von hello,world das programm beendet und der timer somit irgendwie nutzlos ist!

Denn eigentlich soll er ja immer weiter machen mit dem hello,world ausgeben!

Ich hab es dann so probiert(ja ich weiß das ist nicht schön!):

Code: Alles auswählen

def hello():
    print "hello, world"
    
t = threading.Timer(5.0, hello)
t.start()

raw_input('Zum Beenden Taste drücken')
Das Programm beendet dann zwar nicht, aber es gibt trotzdem nur einmal hello, world aus!

Irgendwelche Vorschläge damit das mit dem mehrmaligen Ausgeben funktioniert?!

Danke schonmal!
Mr. Kanister
User
Beiträge: 11
Registriert: Montag 16. Juni 2008, 16:45
Wohnort: Bedburg

Montag 16. Juni 2008, 20:37

Schau dir mal die paar Seiten zum Modul "threading" im openbook Python auf http://www.galileocomputing.de/openbook ... 3633b5d48b
an. Dort wird sehr ausführlich die Implementation von Threads erklärt; unter anderem auch, wie man ein Programm, das Threads nutzt, ordnungsgemäß beendet.

Gruß Martin
LINUX - May the source be with you!
DANIone
User
Beiträge: 11
Registriert: Sonntag 15. Juni 2008, 19:07
Wohnort: Deutschland

Montag 16. Juni 2008, 21:24

Hmm ja ich habs mir angesehen und mal versucht es anzuwenden teilweise.

Zwar gibt er jetzt alle 5 Sekunden hello,world aus aber wenn ich zwischendurch aufs IDLE klicke hängt sich python auf...(bei der Eingabeaufforderung nicht!)

Woran liegt das?

Code: Alles auswählen

import threading

def hello():
    print "hello, world"

x = 1
while x == 1:
    my_timer = threading.Timer(5.0, hello)
    my_timer.start()
    my_timer.join()
Ist diese Variante jetzt in Ordnung so?
Kommt mir irgendwie zu kompliziert vor für mein Problem!

Hat jemand eventuell einen anderen Vorschlag wie ich eine Aktion alle x Sekunden ausführen kann??

Danke für eure Hilfe!
Zuletzt geändert von DANIone am Montag 16. Juni 2008, 23:43, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 16. Juni 2008, 21:56

Kleiner Tipp: Schau dir Bitte mal PEP8 an - gibt ja nun auch ne deutsche Übersetzung von mir dazu ;) *hust* - macht den Code IMHO weit lesbarer.

So zum Problem.

Sofern das Threading nich wichtig is wäre:

Code: Alles auswählen

from time import sleep

while True:
    do_foo()
    sleep(x)  #Hier natürlich deine Zeit anpassen ;)
Sollte aber kein Problem sein das auf Threading zu übertragen.
Mr. Kanister
User
Beiträge: 11
Registriert: Montag 16. Juni 2008, 16:45
Wohnort: Bedburg

Dienstag 17. Juni 2008, 14:33

Kommt mir irgendwie zu kompliziert vor für mein Problem!
Die Frage ist ja, ob es dir primär darum ging die Funktionalität von Threads auszuprobieren oder ob es wirklich nur um eine Wartezeit geht.

Wenn es nur ums warten geht, dann reicht der Ansatz von cofi völlig aus. Wenn es dir um die Threads ging, dann ist dein Ansatz vollkommen in Ordnung :).

Gruß Martin
LINUX - May the source be with you!
DANIone
User
Beiträge: 11
Registriert: Sonntag 15. Juni 2008, 19:07
Wohnort: Deutschland

Dienstag 17. Juni 2008, 21:24

Ja mit time.sleep hab ich es vor der threading Variante schonmal probiert gehabt, jedoch taucht dort dasselbe Problem auf, nämlich dass sich die Python IDLE beim Ausführen des Scripts aufhängt!

In der Eingabeaufforderung passiert dies nicht und das Script macht was es machen soll ohne sich aufzuhängen:)

Code: Alles auswählen

import time

while True:
    print 'bla'
    time.sleep(5)
Kann man das sich Aufhängen der IDLE irgendwie verhindern?
Zuletzt geändert von DANIone am Dienstag 17. Juni 2008, 21:46, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dienstag 17. Juni 2008, 21:39

Folgendes: Du erzeugst damit eine Endlosschleife. Wenn du eine Endlosschleife willst, dann benutze doch bitte

Code: Alles auswählen

 while True: ..
Und keine Variable extra dafür.

Der Code funktioniert bei mir prima. Eventuell verhindert IDLE die Ausführung, da das Programm sich nicht selbst beenden kann. Aber so sehr kenn ich mich nicht mit IDLE aus. Versuchs mal über den Aufruf ``python $datei ''
Antworten