2012-09-13 16 views
13

Ich verwende apscheduler apscheduler und ich versuche, in Parameter an die Handler-Funktion zu übergeben, die aufgerufen wird, wenn der geplante Auftrag gestartet wird:Gabe von Parametern Handler-Funktion

from apscheduler.scheduler import Scheduler 
import time 

def printit(sometext): 
    print "this happens every 5 seconds" 
    print sometext 

sched = Scheduler() 
sched.start() 

sometext = "this is a passed message" 
sched.add_cron_job(printit(sometext), second="*/5") 

while True: 
    time.sleep(1) 

Dadurch mir die folgende Störung gibt:

TypeError: func must be callable 

Ist es möglich, Parameter in den Funktionshandler zu übergeben. Wenn nicht, gibt es Alternativen? Grundsätzlich muss jeder geplante Job eine Zeichenfolge zurückgeben, die ich beim Erstellen des Zeitplans übergeben habe. Vielen Dank!

Antwort

12

printit(sometext) ist nicht aufrufbar, es ist das Ergebnis des Anrufs.

können Sie verwenden:

lambda: printit(sometext) 

, die eine aufrufbar ist später genannt zu werden, die wahrscheinlich tun, was Sie wollen.

+0

Süße funktioniert es! Denkst du, du kannst schnell erklären, warum das funktioniert/wie das den Fehler behebt? Vielen Dank! –

+0

Es wird erklärt. Sie müssen eine Funktion übergeben, d. H. Etwas, das aufgerufen werden kann. def foo(): pass "foo" ist die Funktion "foo()" ist der Rückgabewert des Aufrufs dieser Funktion. –

+0

@ still.Learning Python unterstützt die Erstellung von anonymen Funktionen (d. H. Funktionen, die nicht an einen Namen gebunden sind) zur Laufzeit mit einem Konstrukt namens "Lambda". Dies ist eine normale Funktion -> def f (h): zurück h ** 10, und dies ist ein Lambda-Funktion -> g = Lambda h: h ** 10, beachten Sie den Unterschied ;) –

10

Da es sich um das erste Ergebnis, das ich gefunden, wenn das gleiche Problem, ich hinzufüge, eine aktualisierte Antwort:

Nach dem docs für die aktuellen apscheduler (v3.3.0) Sie entlang der Funktion Argumente übergeben können in der add_job() Funktion.

So im Fall von OP wäre es:

sched.add_job(printit, "cron", [sometext], second="*/5") 
+0

Wenn Sie das tun benannte Argumente sollten Sie den Argumenten der Jobfunktion mit arg vorausgegangen sein. Beispiel: args = [arg1, arg2] – Milso