1

我的意图是从列表中随机发送一条消息,每周在随机的一天,在凌晨 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()
4

2 回答 2

3

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

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

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

于 2013-11-05T23:39:13.060 回答
0

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

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

scheduler.add_job(postTweet, day_of_week="0-6/6", hour='2-6/3' args='Your Payload as dict')
于 2018-03-11T16:17:07.393 回答