UnboundLocalError报错求助:定时文件备份脚本问题排查
问题分析与解决
1. 核心错误原因:UnboundLocalError
在take_backup()函数中,你对dest_file_name执行了赋值操作(dest_file_name = src_file_name),Python会自动将该变量判定为局部变量。但在赋值前的if dest_file_name != ""判断中,你已经引用了这个未定义的局部变量,因此触发UnboundLocalError。
2. 其他代码问题
- 缩进错误:
try块未正确包裹后续代码,if语句和except块的缩进不符合Python语法规范。 - schedule调用错误:
schedule.every(10).second.do(take_backup())直接执行了函数,应传入函数对象take_backup(不带括号)。 - 冗余逻辑:全局变量已定义
dest_file_name = "file.txt",函数内的dest_file_name = src_file_name属于重复操作,无实际意义。
修复后的完整代码
from datetime import date import os import shutil import schedule import time # 添加time模块维持脚本运行 today = date.today() date_format = today.strftime("%d_%b_%Y_") src_file_name = "file.txt" src_folder = "C:\\Users\\Xealtron\\Desktop\\Backup\\BackupFolder" dest_file_name = "file.txt" dest_folder = "C:\\Users\\Xealtron\\Desktop\\bup" def take_backup(): try: # 直接使用全局变量dest_file_name,避免局部变量未定义问题 if dest_file_name != "": full_dest_name = date_format + dest_file_name shutil.copy2(os.path.join(src_folder, src_file_name), os.path.join(dest_folder, full_dest_name)) print("备份完成") except FileNotFoundError: print("文件不存在,请检查路径是否完整") # 传入函数对象,不要直接调用 schedule.every(10).second.do(take_backup) # 维持脚本运行,确保定时任务触发 while True: schedule.run_pending() time.sleep(1)
关键修复点说明
- 函数中若仅读取全局变量,无需额外声明,直接使用即可(本案例无需修改全局变量,直接调用即可)。
- 修正
try/except缩进,确保代码块被正确包裹。 - 添加
time模块和循环逻辑,让脚本持续运行,否则schedule定时任务无法生效。 - 将目标文件名拼接单独提取,提升代码可读性。
内容的提问来源于stack exchange,提问作者Arthetine
相关产品推荐
相关产品推荐

