Python编写文件备份程序时触发NameError: name 'src' is not defined报错求解
NameError报错排查与代码修正
该报错的核心触发原因是代码缩进完全错位,导致Python作用域规则失效,你认知中已经定义的src变量实际从未在全局执行作用域完成赋值。
具体问题点
- 作用域错位:代码中的
if __name__ == '__main__'入口块被错误嵌套在backup()函数内部,而报错提示的backup(src, dest)调用行因为缩进失误落在全局最外层,这个位置的src既没有被定义为全局变量,也没有从函数作用域向外传递,直接触发未定义报错。 - 变量边界混淆:
backup()函数定义的src、dest是接收外部值的形参,你在函数内部通过input()获取的路径值被单独赋值给了sourceFilePath、destFilePath,从未和形参做绑定,两套路径变量完全脱节。 - 逻辑笔误:注释掉的
found = true存在Python语法错误(布尔值要求首字母大写,应为True);found = False缩进错误放置在for循环内部,会无条件覆盖目录存在的判定结果;脚本用到的isdir、listdir、path、copy2、argv均未做模块导入,即使修正缩进也会触发导入类报错。 - 执行流错误:参数校验后的
exit(1)缩进没有绑定到if判断分支下,会导致无论命令行参数是否符合要求,脚本都会直接退出,无法执行备份逻辑。
修正后可运行代码
# 导入依赖模块 from os import listdir, isdir, path from sys import argv from shutil import copy2 def backup(src, dest): # 校验源、目标目录是否存在 found = True for directory in [src, dest]: if not isdir(directory): print(f'could not find {directory}') found = False if not found: exit(1) # 遍历源目录执行备份 for sourceFileName in listdir(src): source_full_path = path.join(src, sourceFileName) dest_full_path = path.join(dest, sourceFileName) # 跳过子目录,仅备份普通文件 if isdir(source_full_path): continue copy2(source_full_path, dest_full_path) # 入口块与函数定义保持全局平级缩进 if __name__=='__main__': # 校验命令行参数 if len(argv) != 3: print(f'Usage: {argv[0]} SRC DEST') exit(1) # 执行备份 backup(argv[1], argv[2]) print('Backup successful!')
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

