应使用tempfile.gettempdir()动态获取用户级临时目录,windows系统级路径需拼接os.environ.get("windir")+"/temp"并校验,删文件时用onerror回调跳过permissionerror/oserror,生产环境交由系统调度器而非schedule。

直接用 schedule + shutil.rmtree 配合系统路径判断就能跑起来,但关键在于「临时文件夹位置不统一」和「正在被占用的文件删不掉」——这两个问题不处理,脚本要么漏删,要么报错退出。
Windows 和 macOS/Linux 的临时目录路径怎么自动识别?
不能硬编码 C:\Users\XXX\AppData\Local\Temp 或 /tmp,得靠标准库动态获取。Python 的 tempfile.gettempdir() 是最稳妥的选择,它返回当前用户有写权限、且符合系统惯例的临时目录;但注意:它不包含系统级全局临时区(比如 Windows 的 C:\Windows\Temp),这类路径需要额外判断。
- 用户级临时目录:一律用
tempfile.gettempdir(),跨平台安全 - Windows 系统级临时目录:检查环境变量
os.environ.get("WINDIR"),拼接os.path.join(windir, "Temp"),再确认存在且可读 - macOS/Linux 全局临时区:
/var/tmp比/tmp保留时间更长,一般不需要清,除非明确业务要求;/tmp已被tempfile.gettempdir()覆盖
删文件前怎么跳过“正被占用”或“权限不足”的文件?
shutil.rmtree() 默认遇到任何错误就抛 PermissionError 或 ProcessLookupError,导致整个清理中断。必须用 onerror 回调接管异常,并只跳过不可删项,而不是静默吞掉所有错误。
- 定义回调函数,对
PermissionError和OSError(含“进程正在使用”)做pass处理 - 避免捕获
FileNotFoundError——这说明目录已被删,属于正常情况,不用干预 - 不要用
ignore_errors=True,它会掩盖路径不存在等真正该报警的问题
def remove_readonly(func, path, _):
try:
os.chmod(path, stat.S_IWRITE)
func(path)
except (PermissionError, OSError):
pass # 跳过被占用或无权限项
<p>shutil.rmtree(temp_dir, onerror=remove_readonly)
</p>
定时执行选 schedule 还是系统 cron/at?
开发阶段用 schedule 最方便,但生产环境长期运行必须交还给系统调度器——Python 进程挂了,schedule 就彻底停摆。
- 开发调试:用
schedule.every().day.at("03:00").do(clean_temp)+schedule.run_pending()循环,加个time.sleep(60)防空转 - Linux/macOS 生产部署:写好脚本后,用
crontab -e加一行0 3 * * * /usr/bin/python3 /path/to/clean.py - Windows 生产部署:用任务计划程序,触发器设为“每天 03:00”,操作设为启动程序
pythonw.exe(避免弹黑窗),参数填脚本绝对路径 - 别在脚本里写死绝对路径——用
os.path.dirname(os.path.abspath(__file__))动态定位
真正难的不是删文件,而是判断哪些能删:浏览器缓存、IDE 的 .idea 文件夹、编译中间产物……它们都在临时目录下,但删了可能影响正在运行的程序。建议首次运行时加 --dry-run 参数,只打印将删的路径,人工确认一遍再放开执行。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











