Python程序在IDLE运行正常,桌面双击启动时第三方模块致闪退
Python语音助手双击启动闪退问题排查与解决
问题描述
我的Python语音助手在IDLE里运行完全正常,但双击桌面程序启动时,系统自带模块能正常工作,通过pip安装的第三方模块会导致程序直接闪退。我加了input('press enter to exit.')测试,只要代码涉及第三方模块就会闪退。重置电脑修复麦克风后出现这个问题,之前一切正常。
程序代码
import speech_recognition as sr import subprocess as rr from playsound import playsound from pynput.keyboard import Key, Controller import time import webbrowser import os import random import operator import psutil response = random.randint(1,2) if response==1: re = 'Acheive.mp3' elif response==2: re = 'At-Your-Service.mp3' def close_app(app_name): running_apps=psutil.process_iter(['pid','name']) #returns names of running processes found=False for app in running_apps: sys_app=app.info.get('name').split('.')[0].lower() if sys_app in app_name.split() or app_name in sys_app: pid=app.info.get('pid') #returns PID of the given app if found running try: #deleting the app if asked app is running.(It raises error for some windows apps) app_pid = psutil.Process(pid) app_pid.terminate() found=True except: pass else: pass if not found: print(app_name+" not found running") else: print(app_name+'('+sys_app+')'+' closed') def takeCommand(): r = sr.Recognizer() playsound(re) with sr.Microphone() as source: print("Listening...") r.pause_threshold = 1 audio = r.listen(source) try: print("Recognizing...") query = r.recognize_google(audio, language ='en-in') print(f"User said: {query}\n") except Exception as e: print(e) print("Unable to Recognize your voice.") return "None" return query query = takeCommand().lower() if 'game on' in query or 'steam' in query: playsound('Jarvis-Game.mp3') rr.Popen("C:\\Program Files (x86)\\Steam\\steam.exe") elif "let's chat" in query or "discord" in query: keyboard = Controller() keyboard.press(Key.ctrl) keyboard.press(Key.alt) keyboard.press('q') keyboard.release(Key.ctrl) keyboard.release(Key.alt) keyboard.release('q') elif "tunes" in query or 'spotify' in query: keyboard = Controller() keyboard.press(Key.ctrl) keyboard.press(Key.alt) keyboard.press('s') keyboard.release(Key.ctrl) keyboard.release(Key.alt) keyboard.release('s') time.sleep(5) keyboard.press(Key.space) keyboard.release(Key.space) elif "watch something" in query or 'youtube' in query: webbrowser.open("https://www.youtube.com/") elif "introduce" in query or 'who are you' in query: playsound('Jarvis-Intro.mp3') elif 'model' in query or 'untiy' in query: keyboard = Controller() keyboard.press(Key.ctrl) keyboard.press(Key.alt) keyboard.press('u') keyboard.release(Key.ctrl) keyboard.release(Key.alt) keyboard.release('u') playsound('Project.mp3') elif 'shutdown' in query or 'security protocol' in query: playsound('Shutting-Down.mp3') os.system("rundll32.exe powrprof.dll,SetSuspendState 0,1,0") elif 'uploaded' in query: playsound('Uploaded.mp3') elif 'music' in query: query = takeCommand().lower() if 'cyberdream' in query: webbrowser.open('https://www.youtube.com/watch?v=yhCuCqJbOVE') elif 'jazz' in query: webbrowser.open('https://www.youtube.com/watch?v=idlUMwT4w84&t=2993s') elif 'upbeat' in query: webbrowser.open('https://www.youtube.com/watch?v=uoSTi_HZj5o&list=RDuoSTi_HZj5o&start_radio=1') elif 'google' in query: query = takeCommand().lower() webbrowser.open('https://www.google.com/search?q='+query) elif 'solve' in query: response = random.randint(1,2) if response==1: re = 'Acheive.mp3' elif response==2: re = 'At-Your-Service.mp3' playsound(re) r = sr.Recognizer() my_mic_device = sr.Microphone(device_index=1) with my_mic_device as source: r.adjust_for_ambient_noise(source) audio = r.listen(source) my_string=r.recognize_google(audio) print(my_string) def get_operator_fn(op): return { '+' : operator.add, '-' : operator.sub, 'x' : operator.mul, '*' : operator.mul, '/' : operator.__truediv__, 'divided' :operator.__truediv__, 'Mod' : operator.mod, 'mod' : operator.mod, '^' : operator.xor, }[op] def eval_binary_expr(op1, oper, op2): op1,op2 = int(op1), int(op2) return get_operator_fn(oper)(op1, op2) print(eval_binary_expr(*(my_string.split()))) time.sleep(5) elif 'close' in query and 'app' in query: query = takeCommand().lower() close_app(query) elif 'skip' in query and 'video' in query: time.sleep(3) keyboard = Controller() keyboard.press(Key.shift) keyboard.press('n') keyboard.release(Key.shift) keyboard.release('n')
解决方法
1. 统一Python运行环境
IDLE使用的Python环境和双击启动时的环境可能不一致,重置电脑后系统默认路径可能改变:
- 打开IDLE,执行
import sys; print(sys.executable),复制输出的Python路径(如C:\Python39\python.exe)。 - 右键桌面程序快捷方式,修改“目标”栏为:
[复制的Python路径] [你的脚本绝对路径],确保和IDLE使用的是同一Python环境。
2. 重新安装第三方模块
重置电脑可能导致模块安装损坏,打开命令提示符,用对应Python环境的pip重装:
# 替换为你的Python路径 C:\Python39\python.exe -m pip install speechrecognition playsound pynput psutil
3. 捕获异常查看错误
给代码添加全局异常捕获,双击运行时能显示具体错误:
修改代码结构,将主逻辑放入try-except块:
import traceback # ... 保留所有导入语句 ... if __name__ == "__main__": try: # 原代码从response = random.randint(1,2)开始的所有逻辑 response = random.randint(1,2) if response==1: re = 'Acheive.mp3' elif response==2: re = 'At-Your-Service.mp3' # ... 后续所有代码 ... except Exception as e: print(f"错误信息: {e}") traceback.print_exc() input("按回车键退出...")
4. 检查麦克风设备索引
重置电脑后麦克风索引可能变化,先获取可用设备列表:
import speech_recognition as sr for index, name in enumerate(sr.Microphone.list_microphone_names()): print(f"麦克风索引 {index}: {name}")
运行后找到正确的索引,替换代码中solve分支的device_index=1。
5. 修复音频文件路径
双击运行时工作目录可能是桌面,导致找不到音频文件,改用绝对路径:
import os script_dir = os.path.dirname(os.path.abspath(__file__)) # 替换音频文件路径 re = os.path.join(script_dir, 'Acheive.mp3') if response==1 else os.path.join(script_dir, 'At-Your-Service.mp3') # 其他音频文件如'Jarvis-Game.mp3'等也按此方式修改
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

