Python exec执行动态生成脚本时报unicodeescape语法错误
报错根因
Windows系统路径使用的反斜杠\在Python普通字符串中是转义标识符,你动态写入file.py的路径字符串没有做转义处理,路径开头的C:\User中\U会被Python解析为Unicode长转义序列的起始标记,后续字符不符合\U后必须跟8位十六进制数的语法要求,因此触发truncated \UXXXXXXXX escape语法错误。
现有实现的冗余问题
你当前采用「动态写临时脚本→exec执行」的流程完全没有必要,额外增加了文件IO、转义处理、权限异常的故障点。之前尝试调用外部脚本返回空白无响应,基本是以下原因导致:
- 传入脚本的路径未做转义,脚本启动即触发语法错误直接退出,未捕获stderr错误流就会表现为无输出
- 调用外部进程时未指定正确工作目录,导致脚本找不到依赖或目标文件
- 视频转码是耗时操作,未等待进程执行完成就中断或判定为无响应
修复方案
方案1:最小改动兼容现有逻辑
只需要修改动态写入脚本的代码,给路径字符串增加原始字符串前缀r,让Python不解析路径里的反斜杠转义即可,同时去掉冗余的清空文件操作、指定文件编码避免异常:
import glob import os.path folder_path = r'C:\User\Desktop\Folder\Audio' file_type = r'\*mp4' files = glob.glob(folder_path + file_type) max_file = max(files, key=os.path.getctime) mp3_file = max_file.replace('.mp4', '') # 去掉之前先写空字符串的冗余步骤,w模式会自动清空文件 with open ("file.py", 'w', encoding='utf-8') as f: f.write('from moviepy.editor import *\n' # 路径字符串前加r前缀,标记为原始字符串 f"mp4_file = r'{max_file}'\n" f"mp3_file = r'{mp3_file}.mp3'\n" 'videoclip = VideoFileClip(mp4_file)\n' 'audioclip = videoclip.audio\n' 'audioclip.write_audiofile(mp3_file)\n' 'audioclip.close()\n' 'videoclip.close()\n') exec(open("file.py", encoding='utf-8').read())
方案2:移除临时文件逻辑(推荐)
不需要生成中间脚本、不需要调用exec,直接在主脚本内完成转换逻辑,代码更简洁、排错更方便,完整可运行代码:
import glob import os.path from moviepy.editor import VideoFileClip folder_path = r'C:\User\Desktop\Folder\Audio' file_type = r'\*mp4' files = glob.glob(folder_path + file_type) # 增加空目录判断,避免无文件时max函数报错 if not files: raise RuntimeError("指定目录下未找到MP4文件") max_file = max(files, key=os.path.getctime) # 用os.path.splitext处理后缀,避免误替换文件名中包含的.mp4字符 mp3_file = os.path.splitext(max_file)[0] + '.mp3' videoclip = VideoFileClip(max_file) audioclip = videoclip.audio audioclip.write_audiofile(mp3_file) audioclip.close() videoclip.close()
注意:如果目录下MP4文件较多,glob查找和getctime取最新文件的逻辑可能会因为系统文件时间精度问题取错文件,对准确性要求高可以增加文件修改时间、大小的二次校验。
内容的提问来源于stack exchange,提问作者Drum
相关产品推荐
相关产品推荐

