我有一个 Python 程序,它使用 subprocess.Popen 启动其他程序,然后通常退出。在 Windows 10 上,这可以正常工作:Python 程序创建的控制台用于其他程序,直到所有程序完成。这似乎如文档所述在微软相关引文如下:
当连接到控制台的最后一个进程终止或调用 FreeConsole 时,控制台将关闭。
我有几个使用 Windows 11 的用户报告说,运行我的程序会创建控制台,但控制台会瞬间消失。经过一段时间的思考,我使用 atexit.register 为我的程序添加了五分钟的延迟,在 Windows 11 上的结果是它启动的程序成功运行……但 5 分钟后控制台窗口消失时程序终止了。
这是 Windows 10 和 Windows 11 之间的行为变化吗?这是一个错误吗?有解决方法吗?
根据收到的评论,行为的改变可能不是由于控制台提前关闭,而是由于父进程终止时子进程也被终止。但无论如何,Windows 10 和 Windows 11 之间存在明显的不兼容行为差异,我当然想知道原因。
在对 Windows 控制台进行更多搜索后,我发现控制台程序的默认设置现在是 Windows 终端 (Win 11 22H2)。在这方面,Windows 终端的默认行为是否可能与 Windows 控制台不同?我找到的所有关于 Windows 终端的页面都吹嘘了可见的差异,但没有涉及这个细节。
答案1
调度方面可能存在差异:如果控制台有一秒钟没有用户,则应关闭它。这对于 Windows 10 和 11 都是如此,但 Windows 10 关闭控制台的速度可能较慢。
因此,您不应该在其他进程连接到控制台之前释放控制台。
如果上述方法不可行,则应更改程序,使其在创建控制台后不会自行分离。您可以根据情况添加“停止”按钮或“按 Enter 终止”提示。