2012-09-13 12 views
13

estoy usando apscheduler y yo estoy tratando de pasar parámetros a la función de controlador que se llama cuando se inicia el trabajo programado:paso de parámetros a apscheduler función de controlador

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) 

Hacer esto me da el siguiente error:

TypeError: func must be callable 

Es posible pasar parámetros al controlador de funciones. Si no, ¿hay alguna alternativa? Básicamente, necesito que cada trabajo programado devuelva una cadena que paso cuando creo el calendario. ¡Gracias!

Respuesta

12

printit(sometext) no se puede llamar, es el resultado de la llamada.

Se puede utilizar:

lambda: printit(sometext) 

¿Qué es un exigible a llamarse más tarde que probablemente va a hacer lo que quiere.

+0

dulce que funciona! ¿Crees que puedes explicar rápidamente por qué funciona esto/cómo se corrige el error? ¡Gracias! –

+0

Se explica. Necesita pasar una función, es decir, algo que pueda llamarse. def foo(): pass "foo" es la función "foo()" es el valor de retorno de llamar a esa función. –

+0

@ still.Learning Python admite la creación de funciones anónimas (es decir, funciones que no están vinculadas a un nombre) en tiempo de ejecución, utilizando una construcción llamada "lambda". Esta es una función normal -> def f (h): return h ** 10, y esta es una función lambda -> g = lambda h: h ** 10, observe la diferencia ;) –

10

Dado que este es el primer resultado que encontré cuando tienen el mismo problema, yo estoy añadiendo una respuesta actualizada:

De acuerdo con la docs para la apscheduler actual (v3.3.0) se puede pasar a lo largo de los argumentos de la función en la función add_job().

Así, en el caso de OP sería:

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

Si lo hace argumentos nombrados, debe haber precedido los argumentos de la función de trabajo con arg. Ejemplo: args = [arg1, arg2] – Milso

Cuestiones relacionadas