2012-09-13 103 views
13

我使用apscheduler,我试图在参数的处理函数被调用时,计划作业启动通过:参数传递到apscheduler处理函数

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) 

这样做给了我下面的错误:

TypeError: func must be callable 

是否可以将参数传递给函数处理程序。如果不是,有没有其他的选择?基本上,我需要每个计划作业返回一个字符串,我创建时间表时通过。谢谢!

回答

12

printit(sometext)不是可调用的,它是调用的结果。

您可以使用:

lambda: printit(sometext) 

这是一个可调用稍后调用它可能会做你想要什么。

+0

甜它的作品!你认为你可以很快解释为什么这会起作用/这是如何修复错误的?谢谢! –

+0

这是解释。您需要传递一个函数,即可以调用的函数。 def foo():传递“foo”是函数“foo()”是调用该函数的返回值。 –

+0

@ still.Learning Python支持在运行时使用名为“lambda”的构造创建匿名函数(即未绑定到名称的函数)。 这是一个正常的功能 - > def f(h):return h ** 10, 这是一个lambda functin - > g = lambda h:h ** 10, 注意区别 ;) –

10

由于这是第一个结果有同样的问题时,我发现,我加入了更新的答案:

按照docs当前apscheduler(3.3.0),您可以沿着函数的参数传递在add_job()函数中。

所以在OP的情况下,这将是:

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

如果你这样做命名参数您应该在带有arg的作业函数参数之前。例如:args = [arg1,arg2] – Milso