用subprocess调用TaskList编译为EXE后弹窗问题求助
解决Windows EXE运行时调用tasklist弹出终端窗口的问题
问题根源是Windows环境下,subprocess调用外部命令时默认会为子进程创建控制台窗口,编译成EXE后这个窗口会在每次扫描时弹出。只需给subprocess调用添加creationflags=subprocess.CREATE_NO_WINDOW参数即可阻止窗口弹出。
修改后的完整代码如下:
import subprocess from time import sleep import logging logger = logging.getLogger(__name__) def check_process_running(self): process_name = b'CUSTOM_APP.exe' get_tasklist = 'TASKLIST' # 添加creationflags参数阻止终端窗口弹出 tasklist = subprocess.check_output( get_tasklist, creationflags=subprocess.CREATE_NO_WINDOW ) proc_data = [row for row in tasklist.split(b'\n') if row.startswith(process_name)] return proc_data # 补充原代码缺失的返回值,确保上层能获取扫描结果 def events_tracker(self): while True: try: tasks = self.check_process_running() # some calculations except Exception as e: logger.exception("event capture triggered exception "+str(e)) sleep(5) # 统一使用已导入的sleep方法
关键说明:
subprocess.CREATE_NO_WINDOW是Windows平台特有的进程创建标志,会告知系统不为子进程生成控制台窗口。- 原代码中
check_process_running函数缺少返回值,补充return proc_data后才能让events_tracker获取到扫描到的进程数据。 - 若使用PyInstaller编译EXE,建议额外添加
--noconsole参数(如果主程序本身不需要控制台),进一步避免不必要的控制台窗口弹出。
内容的提问来源于stack exchange,提问作者Ashan Jayasundara
相关产品推荐
相关产品推荐

