PyInstaller打包含无限循环Python脚本后,控制台反复弹窗求助
解决进程监测脚本打包后弹窗及循环优化问题
问题根源
你遇到的弹窗问题,核心是脚本里调用tasklist、os.system这类外部命令时,即使加了--noconsole参数,也会触发临时控制台窗口;另外无限while True循环持续占用CPU,也会让弹窗反复出现的情况更明显。
优化方案
1. 用psutil替代tasklist检测进程
psutil是专门的系统进程管理库,不需要调用外部命令,彻底避免弹窗,进程检测效率也更高。先安装依赖:
pip install psutil
2. 用定时检测替代死循环
通过time.sleep()控制检测间隔,既保证监测的实时性,又能大幅降低CPU占用率。
3. 替换os.system执行关机命令
改用subprocess并添加CREATE_NO_WINDOW参数,避免执行关机命令时弹出窗口。
修改后的完整代码
import psutil import subprocess import time from subprocess import CREATE_NO_WINDOW def process_exists(process_name): # 遍历系统进程,匹配目标进程名 for proc in psutil.process_iter(['name']): try: if proc.info['name'].lower() == process_name.lower(): return True except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass return False def monitor_processes(): while True: # 检测到目标进程则执行关机 if process_exists("RobloxPlayerBeta.exe") or process_exists("RobloxPlayerLauncher.exe"): subprocess.run(["shutdown", "/s"], creationflags=CREATE_NO_WINDOW) break # 关机后可直接退出脚本 # 检测到Windows10Universal.exe时写入日志(无控制台模式print无输出) if process_exists("Windows10Universal.exe"): with open("monitor_log.txt", "a", encoding="utf-8") as f: log_content = f"{time.strftime('%Y-%m-%d %H:%M:%S')} - 检测到Windows10Universal.exe\n" f.write(log_content) # 每5秒检测一次,可根据需求调整间隔 time.sleep(5) if __name__ == "__main__": monitor_processes()
打包注意事项
继续使用--noconsole参数打包即可:
pyinstaller --noconsole --onefile your_script.py
额外说明
- 无控制台模式下
print的内容无法查看,所以改成写入日志文件,方便后续查看监测记录。 - 调整
time.sleep()的参数可以改变检测频率,数值越大CPU占用越低,数值越小监测越实时。 - psutil的进程检测逻辑比调用
tasklist更稳定,还能规避部分权限问题导致的报错。
内容的提问来源于stack exchange,提问作者Panav Gupta
相关产品推荐
相关产品推荐

