Python 3.11 子进程在 Windows 上并未结束

问题描述 投票:0回答:1

在使用 Python 3.11 的 Windows 上,当我启动子进程时,几乎就像该进程被阻止退出一样。

这段代码在 Linux 和 macOS 上运行得非常好

    def launch_game(self):
        self.hide_progress_bar()
        # launch the game
        if sys.platform in ["win32", "win64"]:
            game = subprocess.Popen('Game', creationflags=134217728)
        elif sys.platform == "darwin":
            modes = os.stat('Game').st_mode
            if not modes & stat.S_IXUSR:
                os.chmod('Game', modes | stat.S_IXUSR)
            game = subprocess.Popen('Game')
        elif sys.platform in ["linux", "linux2"]:
            # set WINEDEBUG to -all to hide the annoying wine debug messages
            os.environ["WINEDEBUG"] = "-all"
            game = subprocess.Popen(['wine', 'Game.exe'])
        else:
            logging.warning("Unsupported platform")
            return
        time.sleep(1.5)

        # hide the window
        self.showMinimized()
        self.setWindowFlags(self.windowFlags() & Qt.CustomizeWindowHint)
        self.setWindowFlags(self.windowFlags() & ~Qt.WindowMinMaxButtonsHint)
        while game.poll() is None:
            time.sleep(1.5)
        if game.returncode == 0:
            self.restore_window()
            self.update_status("Thanks for playing!")
        else:
            self.restore_window()
            self.update_status_error("An unexpected error occurred.")

我尝试过使用

subprocess.run
,使用
pywin32
等;仅在 Windows 上,这一切都会导致相同的问题,其中进程在关闭时无法退出/终止自身。 如果应用程序关闭,游戏进程也会关闭,但如果我在任务管理器中手动关闭游戏进程,则应用程序中的代码在使用
subprocess.run
时会按预期继续运行。 如果我使用
subprocess.Popen
应用程序完全死锁,甚至关闭进程也不允许代码继续。我也尝试过使用和不使用
creationflags
,所以我在这一点上迷失了。 我尝试运行的游戏是一个 Python 2.4 编译的 32 位可执行文件(如果这对解决方案有帮助的话)。

python-3.x windows pyqt5 subprocess pyqt6
1个回答
0
投票

使用 subprocess.run 来简化:

不要直接使用 subprocess.Popen,而是考虑使用更高级别的 subprocess.run 函数,该函数设计得更简单,可以更优雅地处理流程生命周期

© www.soinside.com 2019 - 2024. All rights reserved.