Przeglądaj źródła

!2 fix reset script which make memory leak

pcacc 2 tygodni temu
rodzic
commit
b93a32ad2c
1 zmienionych plików z 15 dodań i 8 usunięć
  1. 15 8
      app_dongri.py

+ 15 - 8
app_dongri.py

@@ -163,10 +163,21 @@ def handle_get_title():
 @socketio.on('reset_script')
 def handle_reset_script():
     python = sys.executable
-    while '--reset' in sys.argv:
-    # 从 sys.argv 列表中删除 --reset 参数
-        sys.argv.remove('--reset')
-    os.execl(python, python, *sys.argv)
+    script = os.path.abspath(sys.argv[0]) # 获取当前脚本的绝对路径
+
+    # 构建新的参数列表,移除旧的 --reset 并添加新的
+    new_args = [arg for arg in sys.argv[1:] if arg != '--reset'] # 排除脚本名和旧的 --reset
+    
+    print(f"当前 Python 解释器: {python}")
+    print(f"当前脚本路径: {script}")
+    print(f"重置参数: {[python, script, *new_args, '']}")
+
+    try:
+        os.execv(python, [python, script, *new_args, ''])
+    except Exception as e:
+        print(f"重置失败: {e}")
+        subprocess.Popen([python, script, *new_args, ''])
+    sys.exit(0) # 终止当前进程
 
 @socketio.on('restart_game')
 def handle_restart_game():
@@ -181,13 +192,9 @@ def handle_restart_game():
     print(f"重启参数: {[python, script, *new_args, '--reset']}")
 
     try:
-        # 使用 os.execv 是一种更“彻底”的重启方式,它会替换当前进程
-        # 但 subprocess.Popen 也可以,前提是旧进程退出
-        # subprocess.Popen([python, script, *new_args, '--reset'])
         os.execv(python, [python, script, *new_args, '--reset'])
     except Exception as e:
         print(f"重启失败: {e}")
-        # 如果 os.execv 失败,可以尝试 subprocess.Popen 作为备用
         subprocess.Popen([python, script, *new_args, '--reset'])
 
     sys.exit(0) # 终止当前进程