??????程序在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:\Users\dell\anaconda3\envs\bpm\Lib\site-packages\PyInstaller\hooks。(注意:如果使用虚拟环境,应找到虚拟环境下的pyinstaller),将刚才编写的hook文件放到该文件下。
第四步:重新编译
删除build文件夹,重新编译即可。
|