如何通用检测Python脚本是否在临时窗口中运行?
判断Python脚本运行的控制台类型
针对你遇到的「脚本在CLI窗口运行时无需等待输入,双击启动时需要暂停窗口」的需求,这里提供几种通用的检测方案:
方法1:跨平台终端检测
利用标准输入输出的终端属性判断,这是最通用的跨平台方案。当脚本在cmd、PowerShell等交互式CLI环境运行时,sys.stdin和sys.stdout会连接到终端;而双击启动的临时窗口中,这些流的终端属性会失效。
代码实现:
import sys def is_interactive_cli(): return sys.stdin.isatty() and sys.stdout.isatty() if __name__ == "__main__": print("程序执行完成") # 非交互式环境(临时窗口)则等待输入 if not is_interactive_cli(): input("按回车键关闭窗口...")
这个方案无需额外依赖,适配Linux、macOS和Windows,但在Windows下部分第三方启动器场景可能有例外。
方法2:Windows平台父进程检测
针对Windows系统,可以通过判断父进程名称来精准识别启动来源:如果父进程是explorer.exe,说明是从资源管理器双击启动;如果是cmd.exe、powershell.exe等,则是在持久CLI窗口运行。
需要先安装psutil模块(pip install psutil),代码如下:
import psutil import os def is_launched_from_explorer(): parent_proc = psutil.Process(os.getppid()) return parent_proc.name().lower() == "explorer.exe" if __name__ == "__main__": print("程序执行完成") if is_launched_from_explorer(): input("按回车键关闭窗口...")
这个方案精准匹配Windows双击场景,但需要额外安装依赖。
方法3:Windows API底层检测
通过调用Windows原生API直接判断控制台窗口的归属:如果当前控制台窗口是由脚本自身进程创建的,说明是双击启动的临时窗口;反之则是预先存在的CLI窗口。
代码实现(无需额外依赖):
import ctypes import os from ctypes import wintypes kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) user32 = ctypes.WinDLL('user32', use_last_error=True) def is_temporary_console(): hwnd = kernel32.GetConsoleWindow() if not hwnd: return False pid = wintypes.DWORD() user32.GetWindowThreadProcessId(hwnd, ctypes.byref(pid)) # 控制台窗口由当前进程创建,即为临时窗口 return pid.value == os.getpid() if __name__ == "__main__": print("程序执行完成") if is_temporary_console(): input("按回车键关闭窗口...")
这个方案是Windows专属的底层实现,无需依赖第三方库,准确性最高。
内容的提问来源于stack exchange,提问作者Avri
相关产品推荐
相关产品推荐

