使用crontab运行Python工时表生成脚本失败问题求助
本地运行基于Word模板生成工时表的Python脚本能正常生成文件,但通过crontab定时执行时毫无结果。脚本及crontab配置如下:
脚本代码
import random from docxtpl import DocxTemplate from datetime import datetime dateNow = datetime.today().strftime("%d.%m.%y") jobs = ["job1", "job2", "job3"] doc = DocxTemplate("Template.docx") mon = random.choice(jobs) tue = random.choice(jobs) wed = random.choice(jobs) thur = random.choice(jobs) fri = random.choice(jobs) context = {'mon' : mon, 'tue' : tue, 'wed' : wed, 'thur' : thur, 'fri' : fri, 'date' : dateNow} doc.render(context) doc.save(r'/Users/pathToSaveLocation/' + "{}".format(dateNow) + ".docx")
crontab配置
***** python absolutePathToScript/main.py
注:5个*是测试用,用的是Mac系统,本人是Python新手。
已尝试过的操作:改用绝对路径、更换脚本所在文件夹、检查终端操作权限、测试crontab能执行其他任务(比如播放声音),但都没解决问题。
1. 修正crontab时间格式
你的crontab格式错误,5个*之间必须用空格分隔,正确格式是:
* * * * * python absolutePathToScript/main.py
这样脚本会每分钟执行一次,先把格式改对再说。
2. 指定Python解释器的绝对路径
crontab的环境变量和终端不一样,大概率找不到你平时用的Python版本。先在终端执行which python或者which python3(如果用的是Python3),拿到绝对路径,比如/usr/local/bin/python3,然后替换crontab里的python:
* * * * * /usr/local/bin/python3 absolutePathToScript/main.py
3. 给模板文件用绝对路径
脚本里DocxTemplate("Template.docx")用的是相对路径,crontab执行时的工作目录不是脚本所在的文件夹,肯定找不到模板。把模板路径改成绝对路径,比如:
doc = DocxTemplate("/Users/你的用户名/模板所在路径/Template.docx")
4. 检查保存路径的权限和正确性
先确认/Users/pathToSaveLocation/这个路径确实存在,而且crontab运行的用户有写入权限。保险起见,可以把保存路径改成用户目录下的文件夹,比如/Users/你的用户名/Documents/。
5. 记录运行日志找错误
让crontab把脚本的输出和错误信息写到日志文件里,方便排查问题。修改crontab配置:
* * * * * /usr/local/bin/python3 absolutePathToScript/main.py >> /Users/你的用户名/cron_logs.txt 2>&1
执行后打开cron_logs.txt,里面会显示脚本运行时的错误(比如找不到模块、路径不存在之类的)。
6. 确保依赖包安装在crontab用的Python环境里
如果docxtpl是装在虚拟环境或者特定Python版本下的,crontab用的Python可能找不到这个包。要么指定虚拟环境的Python路径,要么用对应版本的pip重新装依赖:
比如用Python3的话,执行/usr/local/bin/python3 -m pip install docxtpl。
内容的提问来源于stack exchange,提问作者reedrainer

