Python语音助手elif语句异常反复读取desktop.ini问题咨询
问题产生原因
- 逻辑判断语法错误:你写的多条件判断
'play music' or 'play song' or 'play songs' in query不符合Python语法规则。Python中该语句会被拆解为判断'play music'(非空字符串恒为True)、'play song'(非空字符串恒为True)、'play songs' in query三个条件的或关系,所以只要运行到这条判断,结果永远为True,直接触发music()函数,后续所有elif语句永远不会被执行。 - 音频目录读取未过滤系统文件:
os.listdir会读取目录下所有文件,包括系统生成的隐藏配置文件desktop.ini,你直接取songs[0]打开,自然会优先打开这个排在最前面的系统文件。 - 无输入场景未做拦截:当没有识别到语音输入时,
takeCommand()会返回字符串"None",此时前面的5条判断都不满足,直接触发上述的恒真判断,就会反复执行music()函数。 - 函数命名冲突:你自定义的
wikipedia函数和导入的wikipedia第三方库重名,调用时会触发递归调用报错,只是因为前面的恒真判断先被触发,这个问题暂时没暴露。 - 保留5-6条elif时运行正常,是因为此时那个错误的多条件判断还没被加入代码,自然不会触发恒真逻辑。
修复方案
- 修正所有多条件判断的语法,每个判断项都要完整写匹配规则:
# 原来的错误写法替换为 elif 'play music' in query or 'play song' in query or 'play songs' in query: music() # 下方的播放YouTube音乐的判断也同步修正 elif 'play music on youtube' in query or 'play song on youtube' in query or 'play songs on youtube' in query: musicyt() - 过滤音乐目录的非音频文件,排除desktop.ini等系统文件:
def music(): music_dir = '你的音乐目录路径' # 只保留常见音频格式文件,过滤系统文件 songs = [f for f in os.listdir(music_dir) if f.endswith(('.mp3', '.wav', '.flac', '.ogg'))] if songs: print(songs) os.startfile(os.path.join(music_dir, songs[0])) else: speak("未找到可播放的音频文件") - 增加无输入拦截逻辑,在主循环开头加判断:
if __name__ == "__main__": wishMe() while True: query = takeCommand().lower() # 新增无输入拦截 if query == "none": continue # 后续原有判断逻辑 - 重命名自定义的维基百科搜索函数,避免和导入的库重名:
# 函数名修改为search_wikipedia def search_wikipedia(query): speak('Searching Wikipedia...') query = query.replace("wikipedia", "") # 调用第三方wikipedia库的summary方法 results = wikipedia.summary(query, sentences=2) speak("According to Wikipedia") print(results) speak(results) # 主逻辑里的调用同步修改 if 'wikipedia' in query: search_wikipedia(query)
内容的提问来源于stack exchange,提问作者darkstorm
相关产品推荐
相关产品推荐

