所以,我已经构建了这个漂亮的应用程序(using camelot)并且不知道如何在其上实现预定作业,它可以定期发送基于某些条件的电子邮件。我正在尝试使用schedule实现它,但不知道如何让我的应用程序自动调用它。 这是我的代码:
import time, schedule
def job():
print "I'm working..."
schedule.every(10).seconds.do(job)
while True:
schedule.run_pending()
time.sleep(1)
当我开始申请时,没有任何作用。如何让我的应用程序意识到这一点。 如果可能的话,我希望这个计划作业在没有启动我的应用程序的情况下执行。
答案 0 :(得分:0)
如果要安排将与用户交互的作业,则必须使用 Camelot Actions ,它们有自己的方法在模型线程中执行函数,将结果发布到GUI线程,然后回来......
但是,您不需要这样做,您只需要运行将访问数据库,创建电子邮件并发送它的作业(功能),而无需与用户交互。这可以通过完全独立的应用程序完成,无需GUI。
为了避免创建两个应用程序,您可以使用命令行参数更改行为。如果您启动应用程序时没有任何参数,它将照常打开GUI,但如果您使用-background
运行它,它将只启动计划循环。
然后,您可以在系统启动时挂钩您的应用程序,使用" -background"执行它,您将在不需要用户启动应用程序的情况下运行计划。
如果稍后用户启动应用程序,那么您将运行两个实例,第一个运行计划循环,第二个运行GUI。
main.py:
if __name__ == '__main__':
import sys
if "-background" in sys.argv:
import background
background.main()
else:
main() #camelot's main
background.py:
from camelot.core.orm import Session
import time, schedule
def job():
session = Session()
#Use session to access and manipulate model
print "I'm working..."
session.flush() #flush session to DB
def main():
from camelot.core.conf import settings
settings.setup_model()
schedule.every(10).seconds.do(job)
while True:
schedule.run_pending()
time.sleep(1)
您应该使用python main.py -background
运行该应用。