在使用 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 位可执行文件(如果这对解决方案有帮助的话)。
使用 subprocess.run 来简化:
不要直接使用 subprocess.Popen,而是考虑使用更高级别的 subprocess.run 函数,该函数设计得更简单,可以更优雅地处理流程生命周期