栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python编译exe后无法执行定时任务(apscheduler)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python编译exe后无法执行定时任务(apscheduler)

      程序在pycharm运行正常,能按照设定时间定时执行任务,打包exe后定时功能失效。常见原因有有个:一是add_job方法不能使用add_job(jobname,'cron',minute=15)的形式,而要使用CronTrigger方法,原因暂时未知,可能是打包后不识别‘cron’参数,interval一样;二是apscheduler需要用到第三方库tzdata的data文件(关于时区的tzdata.zoneinfo.Asia),而pyinstaller没有自带该库的hook,所以找不到对应的时区信息,就无法定时。         

        解决方法如下:(以下情况不一定同时出现,逐一尝试)

第一步:修改add_job方式

原方式:
sched.add_job(monitor.Tasks, 'cron', minute=15)

新方式:
from apscheduler.triggers.cron import CronTrigger
trggier = CronTrigger(minute=15) 
sched.add_job(monitor.Tasks,trigger=trggier)

第二步:添加找不到的库

打包exe后,不要双击exe运行,在控制台进入exe所在目录使用命令方式运行:.xxx.exe,这样控制台不会关闭,方便查看报错信息。先后报错:找不到tzdata、tzdata.zoneinfo.Asia模块,如下。

但虚拟环境中已经安装了该模块,网上的一种解决方案是在程序中import该模块,但实际import时提示没有该模块,另一种方案是在打包生成的.spec文件中找到hiddenimports=[ ],在括号中添加该模块,如下,亲测可行。

hiddenimports=["tzdata","tzdata.zoneinfo.Asia"]

重新编译:

pyinstaller test.spec

第三步:编写hook文件

解决上述问题后,重新编译再运行提示:

原因如开始所说,pyinstaller没有自带tzdata的hook,需要自己写一个放进去,hook文件命名规则: hook-【库名】.py,如hook-tzdata.py,写入如下两行内容:

from PyInstaller.utils.hooks import collect_data_files
datas = collect_data_files("tzdata")

找到pyinstaller存放hook的文件夹,我的是D:Usersdellanaconda3envsbpmLibsite-packagesPyInstallerhooks。(注意:如果使用虚拟环境,应找到虚拟环境下的pyinstaller),将刚才编写的hook文件放到该文件下。

第四步:重新编译

删除build文件夹,重新编译即可。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/529516.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号