在jobstore(apscheduler)中找不到Python高级计划程序作业

在jobstore(apscheduler)中找不到Python高级计划程序作业,python,scheduler,Python,Scheduler,考虑一下这段代码 from apscheduler.scheduler import Scheduler import time class First(): def __init__(self): self.remove_job=None def go(self): self.remove_job('test') class Sched(): def __init__(self): self.sched = Schedu

考虑一下这段代码

from apscheduler.scheduler import Scheduler
import time

class First():
    def __init__(self):
        self.remove_job=None
    def go(self):
        self.remove_job('test')
class Sched():
    def __init__(self):
        self.sched = Scheduler()
        self.sched.add_interval_job(    self.execute,
                        seconds=1,
                        name = 'test'
                        )
    def execute(self):
        print "i'm alive"
    def remove_job(self,job):
        self.sched.print_jobs()
        self.sched.unschedule_job(job)

def main():
    first = First()
    sched = Sched()
    first.remove_job=sched.remove_job
    sched.sched.start()
    time.sleep(5)
    first.go()
    return 0

if __name__ == '__main__':
    main()

python sched_test.py 
i'm alive
i'm alive
i'm alive
i'm alive
i'm alive
Jobstore default:
    test (trigger: interval[0:00:01], next run at: 2011-12-22 01:25:36.577572)
Traceback (most recent call last):
  File "sched_test.py", line 55, in <module>
    main()
  File "sched_test.py", line 51, in main
    first.go()
  File "sched_test.py", line 31, in go
    self.remove_job('test')
  File "sched_test.py", line 43, in remove_job
    self.sched.unschedule_job(job)
  File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/scheduler.py", line 401, in unschedule_job
    raise KeyError('Job "%s" is not scheduled in any job store' % job)
KeyError: 'Job "test" is not scheduled in any job store'
从apscheduler.scheduler导入计划程序
导入时间
类优先():
定义初始化(自):
self.remove\u作业=无
def go(自我):
self.remove_作业(“测试”)
类Sched():
定义初始化(自):
self.sched=Scheduler()
self.sched.add\u interval\u作业(self.execute,
秒=1,
名称='test'
)
def执行(自我):
打印“我还活着”
def移除_作业(自我,作业):
self.sched.print_jobs()
计划外作业(作业)
def main():
first=first()
sched=sched()
首先。删除作业=计划。删除作业
sched.sched.start()
时间。睡眠(5)
首先,开始
返回0
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
python sched_test.py
我还活着
我还活着
我还活着
我还活着
我还活着
作业存储默认值:
测试(触发器:间隔[0:00:01],下次运行时间:2011-12-22 01:25:36.577572)
回溯(最近一次呼叫最后一次):
文件“sched_test.py”,第55行,在
main()
文件“sched_test.py”,第51行,主
首先,开始
go中第31行的文件“sched_test.py”
self.remove_作业(“测试”)
删除作业中第43行的文件“sched_test.py”
计划外作业(作业)
文件“/usr/local/lib/python2.7/dist packages/APScheduler-2.0.2-py2.7.egg/APScheduler/scheduler.py”,第401行,在非计划作业中
raise KeyError('作业“%s”未在任何作业存储“%Job”中计划)
KeyError:“未在任何作业存储中计划作业“测试”
为什么打印作业时会出现此错误?
print\u jobs()
为我提供了正确的概述


有人能解释一下这个问题吗?

请注意,您的
第一个
类实际上没有
sched
实例;它当然不能访问您可能要操作的
调度程序的
sched.sched
实例

class First():
    def __init__(self):
        self.remove_job=None
    def go(self):
        self.remove_job('test')
也许你应该先构造
Sched
对象,这样你就可以把它传递给
first()
构造函数,这样你就可以调用它了。我将勾勒出一个未经测试的机制,我认为可以解决这个问题:

class First():
    def __init__(self, sched):
        self.sched = sched
    def go(self):
        self.sched.remove_job('test')
def main():
    sched = Sched()
    first = First(sched)
    sched.sched.start()
    time.sleep(5)
    first.go()
    return 0
这使得
Sched
类保持独立-
First
Sched
合并可能会找到一个更干净的设计-
First
知道
Sched
控制的作业名称这一事实表明有些事情不太正确


也许退一步,解释一下你想解决什么问题?这并不是最干净的解决方案,因此我想知道您遇到的问题是否可以通过更好的机制来解决。

请注意,您的
第一个
类实际上没有
sched
实例;它当然不能访问您可能要操作的
调度程序的
sched.sched
实例

class First():
    def __init__(self):
        self.remove_job=None
    def go(self):
        self.remove_job('test')
也许你应该先构造
Sched
对象,这样你就可以把它传递给
first()
构造函数,这样你就可以调用它了。我将勾勒出一个未经测试的机制,我认为可以解决这个问题:

class First():
    def __init__(self, sched):
        self.sched = sched
    def go(self):
        self.sched.remove_job('test')
def main():
    sched = Sched()
    first = First(sched)
    sched.sched.start()
    time.sleep(5)
    first.go()
    return 0
这使得
Sched
类保持独立-
First
Sched
合并可能会找到一个更干净的设计-
First
知道
Sched
控制的作业名称这一事实表明有些事情不太正确


也许退一步,解释一下你想解决什么问题?这并不是最干净的解决方案,所以我想知道您遇到的问题是否可以通过更好的机制解决。

您必须将作业实例(由add\u interval\u job返回)传递给unschedule\u job,而不是字符串。
这就解决了问题。

您必须将作业实例(由add\u interval\u job返回)传递给unschedule\u job,而不是字符串。
这就解决了问题。

这对大多数人来说可能是显而易见的,但我花了一段时间才明白。只是想分享我的代码的工作原理:

myJobName= "Homework"

for job in self.sched.get_jobs():
    if job.name == "Homework":
        self.sched.unschedule_job(job)
        print "No more homework!"

这对大多数人来说可能是显而易见的,但我花了一段时间才明白。只是想分享我的代码的工作原理:

myJobName= "Homework"

for job in self.sched.get_jobs():
    if job.name == "Homework":
        self.sched.unschedule_job(job)
        print "No more homework!"

“请注意,您的第一个类实际上没有sched实例;它当然没有访问您可能要操作的调度程序的sched.sched实例的权限。”我同意这一点,但为什么“self.sched.print_jobs()”会生成正确的输出呢?
self.sched.print_jobs()
之所以有效,是因为
self
引用了类型为
Sched
的对象(该对象在
main()
函数中命名为
Sched
First
无法访问
Sched
对象的内部。“请注意,您的第一个类实际上没有Sched实例;它当然无法访问您可能要操作的调度程序的Sched.Sched实例。”我同意这一点,但为什么“self.Sched.print_jobs()”然后生成正确的输出?
self.sched.print_jobs()
之所以有效,是因为
self
引用了类型为
sched
的对象(该对象在
main()
函数中命名为
sched
First
无权访问
Sched
对象的内部。