You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:40:38