使用APScheduler设置cron作业时,Func必须是可调用的

时间:2013-11-05 23:34:25

标签: python cron

我的目的是在每周一次的随机时间凌晨2点到早上6点之间从一个推文列表中随机发送一条消息。我正在使用APScheduler:

sched.add_cron_job(postTweet(messages[random.randint(0, len(messages))]), day_of_week="0-6/6", hour='2-6/3')

我收到了错误:

Traceback (most recent call last):
    File "/app/.heroku/python/lib/python2.7/site-packages/apscheduler/scheduler.py", line 379, in add_cron_job
        sched.add_cron_job(postTweet(messages[random.randint(0, len(messages))]), day_of_week="0-6/6", hour='2-6/3')
        options.pop('coalesce', self.coalesce), **options)
    File "/app/.heroku/python/lib/python2.7/site-packages/apscheduler/job.py", line 47, in __init__
        raise TypeError('func must be callable')
    TypeError: func must be callable
        return self.add_job(trigger, func, args, kwargs, **options)

我不确定错误意味着什么,更不用说如何解决它了。任何对未来的启示都将受到高度赞赏。

编辑:

postTweet的代码:

def postTweet(message):
    log = open('log', 'a')
    log.write("\nMessage being tweeted: %s \n" % message)
    print "Message being tweeted: %s" % message
    twitter.statuses.update(status=message)
    log.close()

2 个答案:

答案 0 :(得分:3)

您的func不是函数,就像它说的那样。您正在调用 PostTweet并将结果(可能是字符串或None,但绝对不是函数)传递给add_cron_job。那只狗不会打猎,monsignor。坚持lambda:在它前面:

sched.add_cron_job(lambda: postTweet(messages[random.randint(0, len(messages))]),
                   day_of_week="0-6/6", hour='2-6/3')

这会创建一个可以在以后调用的函数,而不是在添加作业之前执行它

答案 1 :(得分:0)

我知道我迟到了但是想帮助像我这样的人。

您可以使用args传递有效负载

scheduler.add_job(postTweet, day_of_week="0-6/6", hour='2-6/3' args='Your Payload as dict')