从 python 中的静态文件导入 class 方法
import a class method from file as static in python
其实我找不到合适的话题。我正在尝试使用 Apscheduler
库。我为库创建了一个 class 方法,并自己添加了一些缺失的功能作为一个全新的调度程序库。当使用 SQLAlchemyJobStore
时,添加到调度程序 的函数必须 是可序列化的,但是当我创建一个新的 class 时,添加的函数是 class 本身的成员.例如,假设此代码:
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)
Traceback (most recent call last): File
"...\Python36\lib\site-packages\apscheduler\executors\base.py", line
125, in run_job
retval = job.func(*job.args, **job.kwargs) TypeError: tick() missing 1 required positional argument: 'j'
此错误意味着整个 class 无法序列化,但如果我将我的实例命名为 class 名称(此处为 sched
),它将得到修复。
在示例中,tick
函数 必须 是时间表 class 本身的成员,因为在我原来的 class scheduler.add_job
中得到了修改class 方法的功能,目前,我不想完全编辑我的新时间表 class。
我的问题是,当我想从文件中导入 class 时,就会出现确切的问题。有没有其他方法可以从文件中导入 class?
问题可以通过以下方式规避:
schedule.add_func(sched.tick, args=[schedule, 1, 2], kwargs=dict(a=1, b=2))
但是,这需要您将调度程序移出 sched
class,因为它不能与 sched
class 的实例一起序列化.
因为整个class sched
不能在数据库中序列化,所以class必须定义为静态的。所以我将 class 更改为静态 class.
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)
其实我找不到合适的话题。我正在尝试使用 Apscheduler
库。我为库创建了一个 class 方法,并自己添加了一些缺失的功能作为一个全新的调度程序库。当使用 SQLAlchemyJobStore
时,添加到调度程序 的函数必须 是可序列化的,但是当我创建一个新的 class 时,添加的函数是 class 本身的成员.例如,假设此代码:
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)
Traceback (most recent call last): File "...\Python36\lib\site-packages\apscheduler\executors\base.py", line 125, in run_job retval = job.func(*job.args, **job.kwargs) TypeError: tick() missing 1 required positional argument: 'j'
此错误意味着整个 class 无法序列化,但如果我将我的实例命名为 class 名称(此处为 sched
),它将得到修复。
在示例中,tick
函数 必须 是时间表 class 本身的成员,因为在我原来的 class scheduler.add_job
中得到了修改class 方法的功能,目前,我不想完全编辑我的新时间表 class。
我的问题是,当我想从文件中导入 class 时,就会出现确切的问题。有没有其他方法可以从文件中导入 class?
问题可以通过以下方式规避:
schedule.add_func(sched.tick, args=[schedule, 1, 2], kwargs=dict(a=1, b=2))
但是,这需要您将调度程序移出 sched
class,因为它不能与 sched
class 的实例一起序列化.
因为整个class sched
不能在数据库中序列化,所以class必须定义为静态的。所以我将 class 更改为静态 class.
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)