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

Flask部署到Heroku出现FileNotFoundError找不到static目录如何解决?

报错原因及修复方案

根因分析

  • 路径分隔符系统不兼容:你本地开发环境大概率是Windows系统,路径分隔符用反斜杠\,而Heroku运行环境是Linux系统,路径分隔符为正斜杠/。代码中硬编码的'static\perssonel_data'在Linux系统中会被识别为单个文件名,而非static目录下的子目录,因此触发文件不存在报错。同时反斜杠在Python字符串中属于转义字符,即使在Windows环境下也可能因为转义逻辑导致路径识别异常。
  • 相对路径依赖运行时工作目录:你使用的相对路径是相对于Python进程的运行工作目录生效的,若Heroku启动Flask进程时的工作目录不是项目根目录,即使路径分隔符正确也会找不到对应目录。

修复方案

不要硬编码路径,改用Python标准库的路径拼接工具,自动适配不同操作系统,同时基于固定基准生成绝对路径,避免相对路径的不确定性:

from PyPDF2 import PdfFileReader, PdfFileWriter
import re
import os

def create_desprendible(id, name, month):
    # 以当前脚本所在目录为基准生成绝对路径,也可以用Flask的current_app.root_path更适配Flask项目
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    # 自动适配系统的路径分隔符拼接目录
    path_test = os.path.join(BASE_DIR, 'static', 'perssonel_data')
    # 直接拼接目标文件路径,不需要遍历目录效率更高
    target_pdf = os.path.join(path_test, f'perssonel_data_{month}.pdf')
    
    # 先判断文件是否存在,避免未定义报错
    if not os.path.exists(target_pdf):
        raise FileNotFoundError(f"对应月份的工资单文件不存在:{target_pdf}")
    
    pdf = PdfFileReader(target_pdf)
    pages = []
    for i in range(pdf.getNumPages()):
        content = pdf.getPage(i).extractText() + "\n"
        if re.search(id, content):
            pages.append(i)
    
    if not pages:
        raise ValueError(f"未找到ID为{id}的员工工资单")
    
    pdfWriter = PdfFileWriter()
    for page_num in pages:
        pdfWriter.addPage(pdf.getPage(page_num))
    
    pdf_name = f'DESPRENDIBLE_DE_NOMINA_{str(name).replace(" ", "_")}.pdf'
    with open(pdf_name, 'wb') as f:
        pdfWriter.write(f)
    
    return pdf_name

额外注意事项

Heroku的文件系统是临时文件系统,你代码中生成的pdf_name文件会在应用重启、部署或者24小时无活动后被自动清除,若需要长期保存生成的工资单,建议对接对象存储服务。

内容的提问来源于stack exchange,提问作者Carlos S. C.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:54:00