从文件中以静态方式在python中导入类方法

时间:2018-07-10 06:33:02

标签: python apscheduler

实际上,我找不到合适的主题。我正在尝试使用Apscheduler库。我为该库创建了一个类方法,并作为一个全新的调度程序库自己添加了一些缺少的功能。使用SQLAlchemyJobStore时,调度程序必须所添加的函数必须是可序列化的,但是当我创建新类时,所添加的函数是该类本身的成员。例如,假设此代码:

from datetime import datetime
from time import sleep
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore


class sched:
    def __init__(self):
        jobstores = {
            'default': SQLAlchemyJobStore(url='sqlite:///test.db')
        }
        self.scheduler = BackgroundScheduler(jobstores=jobstores)

    def add_func(self, some_func, args={}, kwargs={}):
        self.scheduler.add_job(
            some_func, 'interval', args=args, kwargs=kwargs, seconds=5, replace_existing=True)

    def start(self):
        self.scheduler.start()


    def tick(self, i, j, **kwargs):
        print("hello{} {}".format(i, j))
        for k in kwargs:
            print(k, ":", kwargs[k])

if __name__ == '__main__':
    schedule = sched()
    schedule.start()
    schedule.add_func(schedule.tick, args=[1, 2], kwargs=dict(a=1, b=2))
    # using the following three lines solve the problem
    # sched = sched()
    # sched.start()
    # sched.add_func(sched.tick, args=[1, 2], kwargs=dict(a=1, b=2))
    while True:
        sleep(.1)
  

回溯(最近通话最近):文件   “ ... \ Python36 \ lib \ site-packages \ apscheduler \ executors \ base.py”,行   125,在run_job       retval = job.func(* job.args,** job.kwargs)TypeError:tick()缺少1个必需的位置参数:'j'

此错误意味着无法对整个类进行序列化,但是如果我将我的实例命名为与类名相同(此处为sched),它将得到修复。 在示例中,tick函数必须本身是Schedule类的成员,因为在我的原始类scheduler.add_job中,该类方法从类方法中获得了修改后的函数,而目前,我不不想完全编辑我的新日程表类。

我的问题是,当我想从文件导入类时,确实发生了问题。还有其他方法可以从文件中导入类吗?

2 个答案:

答案 0 :(得分:1)

可以通过以下方式避免此问题:

schedule.add_func(sched.tick, args=[schedule, 1, 2], kwargs=dict(a=1, b=2))

但是,这要求您将调度程序移出sched类,因为它不能与sched类的实例一起进行序列化。

答案 1 :(得分:0)

由于无法在数据库中序列化整个类sched,因此必须将类定义为静态。所以我将类更改为静态类。

from datetime import datetime
from time import sleep
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore


class sched:
    jobstores = {
        'default': SQLAlchemyJobStore(url='sqlite:///test.db')
    }
    scheduler = BackgroundScheduler(jobstores=jobstores)
    @classmethod
    def add_func(cls, some_func, args={}, kwargs={}):
        cls.scheduler.add_job(
            some_func, 'interval', args=args, kwargs=kwargs, seconds=5, replace_existing=True)

    @classmethod
    def start(cls):
        cls.scheduler.start()

    @classmethod
    def tick(cls, i, j, **kwargs):
        print("hello{} {}".format(i, j))
        for k in kwargs:
            print(k, ":", kwargs[k])

if __name__ == '__main__':
    schedule = sched()
    schedule.start()
    schedule.add_func(schedule.tick, args=[1, 2], kwargs=dict(a=1, b=2))
    while True:
        sleep(.1)