pyinstaller打包发布含有flask_apscheduler 定时任务的flask项目遇到的问题处理办法

问题描述

使用`pyinstaller`打包`flask`项目可以使客户免去安装一整套`python`及下载各种包的繁琐。

我的项目中使用了`flask_apscheduler`周期性定时任务,在编辑环境下测试正常。但用`pyinstaller`打包发布后踩到了一系列的坑。

先上示例源码。此源码来自 https://github.com/viniciuschiele/flask-apscheduler/blob/master/examples/allowed_host.py

(下面的源码与github上的示例略有改动)

from flask import Flask

from flask_apscheduler import APScheduler



class Config(object):

    JOBS = [

        {

            'id': 'job1',

            'func': 'app:job1',

            'args': None,

            'trigger': 'interval',

            'seconds': 10

        }

    ]


    SCHEDULER_ALLOWED_HOSTS = ['my_servers_name']

    SCHEDULER_API_ENABLED = True



def job1(a, b):

    now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    print(now)



if __name__ == '__main__':

    app = Flask(__name__)

    app.config.from_object(Config())


    scheduler = APScheduler()

    # it is also possible to set the list of servers directly

    # scheduler.allowed_hosts = ['my_servers_name']

    scheduler.init_app(app)

    scheduler.start()


    app.run()

 

打包好后运行时遇到的错误:ModuleNotFoundError: No module named 'app'

Traceback (most recent call last):
  File "apscheduler\util.py", line 303, in ref_to_obj
ModuleNotFoundError: No module named 'app'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "app.py", line 727, in <module>
    scheduler.init_app(app)
  File "flask_apscheduler\scheduler.py", line 82, in init_app
  File "flask_apscheduler\scheduler.py", line 328, in _load_jobs
  File "flask_apscheduler\scheduler.py", line 160, in add_job
  File "apscheduler\schedulers\base.py", line 434, in add_job
  File "apscheduler\job.py", line 49, in __init__
  File "apscheduler\job.py", line 162, in _modify
  File "apscheduler\util.py", line 305, in ref_to_obj
LookupError: Error resolving reference app:save_heartbeat: could not import module
[11764] Failed to execute script app

 

解决办法:使用注解方式定义任务

代码改为如下:

from flask import Flask

from flask_apscheduler import APScheduler

import datetime



class Config(object):

    SCHEDULER_API_ENABLED = True



scheduler = APScheduler()



# interval examples

@scheduler.task('interval', id='do_job_1', seconds=5, misfire_grace_time=900)

def job1():

    now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    print(now)


if __name__ == '__main__':

    app = Flask(__name__)

    app.config.from_object(Config())

    scheduler.init_app(app)

    scheduler.start()


    app.run()

 

再次使用`pyinstaller`打包后运行,问题完美解决。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值