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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:52:39