如何在Python中启动MRT.exe?程序崩溃及延迟启动问题求助
问题分析与解决办法
1. 修复"value is either too large or too small for int32"崩溃问题
这个错误源于两处代码问题:
- 错误的类定义语法:你使用了
class Program[executable_app](...)这种不符合Python规范的写法,类继承必须用圆括号,且不需要这类自定义泛型声明。同时type App = customtkinter.CTk()是错误的类型别名定义(类型别名不应实例化),直接删除这些冗余代码即可。 - 实例方法误用
functools.cache:functools.cache会尝试缓存实例对象(self),但GUI实例不可哈希,会导致内部类型转换时触发整数溢出错误。直接移除这些方法上的@functools.cache装饰器——启动MRT的方法不需要缓存。
修改后的核心代码片段:
# 移除错误的类型别名和executable_app定义 class Program(customtkinter.CTk, My_First_Aid_Kit_interface.My_First_Aid_Kit_interface): # 类常量保持不变 @typing.override def __interactive_mode__(self) -> None: subprocess.Popen(["C:\\Windows\\Sysnative\\mrt.exe"], creationflags=subprocess.CREATE_NEW_CONSOLE) @typing.override def __full_scan__(self) -> None: subprocess.Popen(["C:\\Windows\\Sysnative\\mrt.exe", "/F"], creationflags=subprocess.CREATE_NEW_CONSOLE) @typing.override def __full_scan_with_virus_removal__(self) -> None: subprocess.Popen(["C:\\Windows\\Sysnative\\mrt.exe", "/F:Y"], creationflags=subprocess.CREATE_NEW_CONSOLE)
2. 解决MRT.exe需等待程序关闭才出现的问题
这是因为subprocess.run/subprocess.call默认是阻塞调用,会卡住GUI主线程,导致MRT无法正常启动显示。解决要点:
- 用
subprocess.Popen替代run/call,它会启动新进程而不阻塞主线程。 - 若使用32位Python,必须用
C:\\Windows\\Sysnative\\mrt.exe路径——Windows会将32位程序对System32的访问重定向到SysWOW64,而MRT.exe是64位程序。 - 添加
creationflags=subprocess.CREATE_NEW_CONSOLE,确保MRT在独立窗口启动,不受GUI进程阻塞。 - 带参数的调用必须拆分程序名和参数为列表元素,比如
["mrt.exe", "/F"],而非["mrt.exe /F"](后者会被当作不存在的程序名)。
额外小问题修复
你重复定义了self.main_screen_full_scan_with_virus_removal_button变量,最后一个"подешавања"按钮应重新命名,避免覆盖之前的按钮引用:
self.main_screen_settings_button: customtkinter.CTkButton = customtkinter.CTkButton(master=self, text="подешавања", height=25, width=75, font=self.font_for_widgets, fg_color="green") self.main_screen_settings_button.place(x=1, y=190)
内容的提问来源于stack exchange,提问作者Anonymous6598
相关产品推荐
相关产品推荐

