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

含键盘输入功能的Python编译.exe被Windows Defender误报病毒的解决方法

Windows Defender误报Python编译助手程序的解决办法

我用Python写了一款支持语音和文本控制的助手程序,编译成.exe文件后被Windows Defender内置杀毒软件检测为病毒,推测原因是代码中使用了keyboard.press_and_release、keyboard.write以及os.startfile这类具有系统操作权限的函数。以下是我的程序代码:

import pyttsx3
import speech_recognition as sr
import keyboard
import time
import os
import sys

def get_username():
    return os.getlogin()

def open_ragemp():
    ragemp_path = "D:/RAGEMP/updater.exe"
    try:
        os.startfile(ragemp_path)
        return True, "RAGEMP"
    except Exception as e:
        return False, str(e)

def open_yandex_music():
    try:
        keyboard.press_and_release("win+s")
        time.sleep(1)
        keyboard.write("Яндекс.Музыка")
        keyboard.press_and_release("enter")
        return True, "Яндекс.Музыка"
    except Exception as e:
        return False, str(e)

def respond(text):
    print("Бот:", text)
    engine.say(text)
    engine.runAndWait()

def greet(username):
    respond(f"Здравствуйте, {username}! Как я могу помочь вам сегодня?")

def close_program():
    respond("До свидания! Спасибо за использование помощника.")
    sys.exit()

def main():
    global engine
    engine = pyttsx3.init()
    recognizer = sr.Recognizer()

    username = get_username()
    greet(username)

    with sr.Microphone() as source:
        respond(f"{username}, как бы вы хотели вводить команды? Голосом или текстом?")
        audio = recognizer.listen(source)

    try:
        user_input = recognizer.recognize_google(audio, language="ru-RU").lower()
        print(f"{username} сказал:", user_input)
    except sr.UnknownValueError:
        user_input = input("Не удалось распознать. Введите 'голос' или 'текст': ")

    if "голос" in user_input:
        respond("Хорошо, буду ждать команды голосом.")
        while True:
            with sr.Microphone() as source:
                print(f"{username}, скажите ваш запрос:")
                audio = recognizer.listen(source)

            try:
                user_input = recognizer.recognize_google(audio, language="ru-RU").lower()
                print(f"{username} сказал:", user_input)
            except sr.UnknownValueError:
                print(f"{username}, не удалось распознать команду.")
                continue

            if "кто твой разработчик" in user_input:
                respond("Меня разработал tareqq. Его Discord и Telegram выведены в консоль.")
                print('Discord: mewqq. \n Telegram: https://t.me/chvaNNoy')
            
            elif "кто тебя разработал" in user_input:
                respond("Меня разработал tareqq. Его Discord и Telegram выведены в консоль.")
                print('Discord: mewqq. \n Telegram: https://t.me/chvaNNoy')
            
            elif "кто такой джаспер" in user_input:
                respond("Джаспер - это нефор, бывший руководитель Fours Project.")
            
            elif "как дела" in user_input:
                respond(f"У меня всё отлично, спасибо! Как у вас, {username}?")
            
            elif "новости" in user_input:
                respond("Дайте мне немного времени, и я найду для вас актуальные новости.")
            
            elif "анекдот" in user_input:
                respond("Почему программисты так не любят пляж? Потому что они боятся волны!")
            
            elif "способности" in user_input:
                respond("Я могу отвечать на вопросы, рассказывать шутки, предоставлять информацию и многое другое. Что вас интересует?")
            
            elif "игры" in user_input:
                respond("Я, к сожалению, не умею играть в видеоигры, но могу вам помочь найти информацию о них!")
            
            elif "открой рейдж мп" in user_input:
                success, app_name = open_ragemp()
                if success:
                    respond(f"Программа {app_name} успешно запущена.")
                else:
                    respond(f"Программа {app_name} не запустилась. Причина: {app_name}")
            
            elif "открой яндекс музыку" in user_input:
                success, app_name = open_yandex_music()
                if success:
                    respond(f"Программа {app_name} успешно запущена.")
                else:
                    respond(f"Программа {app_name} не запустилась. Причина: {app_name}")
            
            elif "пока" in user_input:
                close_program()
            
            else:
                respond("Извините, я не понял ваш запрос. Пожалуйста, переформулируйте его.")

    elif "текст" in user_input:
        respond("Хорошо, буду ждать команды в текстовом виде.")
        while True:
            user_input = input("Введите команду: ")

            if "кто твой разработчик" in user_input:
                respond("Меня разработал tareqq. Его Discord и Telegram выведены в консоль.")
                print('Discord: mewqq. \n Telegram: https://t.me/chvaNNoy')
            
            elif "кто тебя разработал" in user_input:
                respond("Меня разработал tareqq. Его Discord и Telegram выведены в консоль.")
                print('Discord: mewqq. \n Telegram: https://t.me/chvaNNoy')
            
            elif "кто такой джаспер" in user_input:
                respond("Джаспер - это нефор, бывший руководитель Fours Project.")

            elif "выключи компьютер" in user_input:
                os.system("shutdown /s /t 1")  # Выключение через 1 секунду

            elif "как дела" in user_input:
                respond(f"У меня всё отлично, спасибо! Как у вас, {username}?")
            
            elif "новости" in user_input:
                respond("Дайте мне немного времени, и я найду для вас актуальные новости.")
            
            elif "анекдот" in user_input:
                respond("Почему программисты так не любят пляж? Потому что они боятся волны!")
            
            elif "способности" in user_input:
                respond("Я могу отвечать на вопросы, рассказывать шутки, предоставлять информацию и многое другое. Что вас интересует?")
            
            elif "игры" in user_input:
                respond("Я, к сожалению, не умею играть в видеоигры, но могу вам помочь найти информацию о них!")
            
            elif "открой рейдж мп" in user_input:
                success, app_name = open_ragemp()
                if success:
                    respond(f"Программа {app_name} успешно запущена.")
                else:
                    respond(f"Программа {app_name} не запустилась. Причина: {app_name}")
            
            elif "открой яндекс музыку" in user_input:
                success, app_name = open_yandex_music()
                if success:
                    respond(f"Программа {app_name} успешно запущена.")
                else:
                    respond(f"Программа {app_name} не запустилась. Причина: {app_name}")
            
            elif "пока" in user_input:
                close_program()
            
            else:
                respond("Извините, я не понял ваш запрос. Пожалуйста, переформулируйте его.")

    else:
        respond("Извините, не удалось понять ваш выбор.")
        engine.runAndWait()

    while True:
        user_input = input("\nВведите команду: ")

        if user_input.lower() == "голос":
            # Ввод команд голосом
            pass
        elif user_input.lower() == "текст":
            # Ввод команд текстом
            pass
        elif user_input.lower() == "закрыть":
            close_program()
        else:
            print("\nНеверная команда. Пожалуйста, выберите действие из списка.")

if __name__ == "__main__":
    main()

解决误报的具体方案

一、更换或优化编译工具

  • 改用Nuitka编译:Nuitka会把Python代码转成C代码再编译成.exe,生成的程序更接近原生软件,误报率远低于PyInstaller。安装Nuitka后,执行以下命令:
    nuitka --standalone --windows-disable-console --output-dir=dist your_script_name.py
    
  • 调整PyInstaller参数:如果坚持用PyInstaller,添加这些参数降低被检测概率:
    • --noconsole:不需要控制台时加上,减少程序特征
    • --icon=your_icon.ico:给程序加自定义图标,避免默认图标被识别为可疑
    • --upx-dir=path/to/upx:用UPX压缩程序体积,优化文件结构(注意部分杀毒软件可能对UPX压缩的文件敏感,可按需选择)

二、替换代码中的敏感函数

  • 替换os.startfile:改用subprocess.Popen,参数更透明,减少可疑特征:
    import subprocess
    def open_ragemp():
        ragemp_path = "D:/RAGEMP/updater.exe"
        try:
            subprocess.Popen([ragemp_path], shell=True)
            return True, "RAGEMP"
        except Exception as e:
            return False, str(e)
    
  • 替换keyboard库:改用pyautogui模拟键盘操作,它的行为更贴近真实用户输入,被误报的概率更低:
    import pyautogui
    def open_yandex_music():
        try:
            pyautogui.hotkey('win', 's')
            time.sleep(1)
            pyautogui.write("Яндекс.Музыка")
            pyautogui.press('enter')
            return True, "Яндекс.Музыка"
        except Exception as e:
            return False, str(e)
    
  • 移除高危操作:代码中的os.system("shutdown /s /t 1")直接执行关机命令,很容易被标记为恶意行为。可以改成提示用户手动关机,或者增加二次确认步骤。

三、杀毒软件层面处理

  • 添加白名单:把生成的.exe文件和编译目录添加到Windows Defender的排除列表,路径:Windows安全中心 → 病毒和威胁防护 → 病毒和威胁防护设置 → 添加或删除排除项
  • 提交误报申诉:如果确认程序安全,可通过微软官方渠道提交文件申诉,让官方更新病毒库将程序标记为安全。

内容的提问来源于stack exchange,提问作者tareqq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:32:11