全局定义的selected_files仍报未定义错误,求Python脚本排查
问题排查:'selected_files' is not defined 错误
错误原因
你的代码里,生成VLC播放列表的那段代码写在脚本最外层,Python解释器运行时会从上到下执行:
- 先导入模块、定义函数
- 直接执行
# create a VLC playlist in select folder下面的所有代码 - 最后才调用
main()函数
也就是说,当执行到for file in selected_files:这行时,main()还没运行,selected_files这个变量完全没被定义,所以报错。
修正方案
把生成播放列表的代码全部移到main()函数内部,确保它在selected_files被创建之后再执行,既符合逻辑也能避免变量未定义问题。
修正后的完整代码
import os import random def find_files(folder, extensions): files = [] for root, dirs, filenames in os.walk(folder): for filename in filenames: if any(filename.endswith(ext) for ext in extensions): files.append(os.path.join(root, filename)) return files def main(): # 指定要搜索的文件夹和视频格式 folders = [r"path\to\show1", r"path\to\show2", r"path\to\show3", r"path\to\show4"] extensions = (".mp4", ".avi", ".mkv") selected_files = [] for folder in folders: files = find_files(folder, extensions) if files: selected_files.append(random.choice(files)) else: print(f"No files found in {folder}.") if not selected_files: print("No files found.") return # 创建VLC播放列表(移到此处,确保selected_files已定义) playlist_folder = r"path\where\playlist\is\saved" if not os.path.exists(playlist_folder): os.makedirs(playlist_folder) playlist_file = os.path.join(playlist_folder, "PMTV.xspf") with open(playlist_file, "w", encoding='utf8') as f: f.write('<?xml version="1.0" encoding="UTF-8"?>\n') f.write('<playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">\n') f.write('\t<title></title>\n') f.write('\t<trackList>\n') for file in selected_files: f.write('\t\t<track>\n') f.write(f'\t\t\t<location>{file}</location>\n') f.write('\t\t\t<title></title>\n') f.write('\t\t\t<duration></duration>\n') f.write('\t\t\t<extension application="http://www.videolan.org/vlc/playlist/0">\n') f.write('\t\t\t\t<vlc:id></vlc:id>\n') f.write('\t\t\t</extension>\n') f.write('\t\t</track>\n') f.write('\t</trackList>\n') f.write('</playlist>\n') print(f"{len(selected_files)} files added to {playlist_file}") if __name__ == "__main__": main()
额外优化说明
去掉了global selected_files声明,现在selected_files是main()函数的局部变量,不需要全局声明,代码更规范,也避免了全局变量带来的潜在问题。
内容的提问来源于stack exchange,提问作者rustyshackleford_V
相关产品推荐
相关产品推荐

