You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python脚本结合Cron定时任务每日生成PDF时文件未保存至指定位置的求助

问题分析与解决方案

看起来你踩了个常见的场景适配坑:你的代码是为HTTP请求交互设计的(把PDF作为响应返回给浏览器),但Cron直接运行脚本时,这套逻辑并不会把PDF保存到磁盘——虽然pdfkit确实生成了PDF内容,但它只是以字节流的形式存在于Flask响应对象里,并没有被写入到你指定的路径中。

咱们一步步拆解解决:

1. 核心问题:代码未将PDF写入磁盘

当前main()函数里,pdfkit.from_string(x, False)返回的是PDF的字节数据,你把它包装成Flask的response对象返回了。但当Cron直接执行脚本时,这个返回的响应对象不会被自动处理成文件保存,所以你看不到生成的PDF文件。

2. 修改代码:直接将PDF保存到指定路径

把原来的HTTP响应逻辑改成文件保存逻辑,同时必须注意绝对路径的使用(Cron的工作目录大概率和你的脚本目录不一致):

import os, datetime
from conf import config
from flask import Flask, render_template
import pdfkit

app = Flask(__name__, template_folder='templates')

def main():
    cur_date = datetime.datetime.now()
    # 更简洁的日期格式化写法
    date_str = cur_date.strftime("%Y/%m/%d")
    
    with app.app_context():
        html_content = render_template("daily_update.htm")
        
        # 👉 替换成你的目标目录绝对路径,按日期命名避免文件覆盖
        output_dir = "/absolute/path/to/your/target/folder"
        # 确保目录存在,防止因目录不存在报错
        os.makedirs(output_dir, exist_ok=True)
        output_path = os.path.join(output_dir, f"daily_report_{cur_date.strftime('%Y%m%d')}.pdf")
        
        # 关键:配置wkhtmltopdf的绝对路径(Cron环境可能找不到它)
        # 可以通过终端执行`which wkhtmltopdf`获取实际路径
        wkhtmltopdf_path = "/usr/local/bin/wkhtmltopdf"
        pdf_config = pdfkit.configuration(wkhtmltopdf=wkhtmltopdf_path)
        
        # 直接生成并保存PDF到指定路径
        pdfkit.from_string(html_content, output_path, configuration=pdf_config)
        print(f"✅ PDF已成功保存到:{output_path}")

if __name__ == "__main__":
    main()

3. Cron任务的关键注意事项

  • 全路径指定:在Cron任务里必须写Python解释器和脚本的绝对路径,比如:
    0 0 * * * /usr/bin/python3 /absolute/path/to/your/script.py >> /var/log/pdf_generation.log 2>&1
    
    后面的>> /var/log/pdf_generation.log 2>&1是把脚本输出和错误信息写入日志,方便后续排查问题。
  • 权限检查:确保Cron运行的用户(通常是root或当前登录用户)对目标目录有写入权限。
  • 环境变量适配:Cron的环境变量比普通登录会话少很多,如果wkhtmltopdf找不到,一定要在代码里指定它的绝对路径(就是上面的wkhtmltopdf_path)。

4. 验证方法

先手动运行脚本测试:python3 /absolute/path/to/your/script.py,看是否能生成PDF并输出成功提示。如果手动运行正常但Cron执行失败,大概率是路径或环境变量的问题,去查看日志文件就能找到线索。

内容的提问来源于stack exchange,提问作者matthew fabrie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:53:10