import subprocess import argparse import sys import signal import psutil # Параметры для процессов server_process = None test_server_process = None def usage(): """Функция для отображения помощи""" print("Usage: run_all.py [--test]") sys.exit(1) def terminate_process(process): """Функция для корректного завершения процесса и всех его дочерних процессов""" if process: proc = psutil.Process(process.pid) for child in proc.children(recursive=True): child.terminate() proc.terminate() proc.wait() # Обработчик для сигналов выхода def cleanup(*args): """Функция для остановки серверов при выходе""" global server_process, test_server_process print("Остановка серверов...") terminate_process(server_process) terminate_process(test_server_process) print("Серверы остановлены.") sys.exit(0) # Завершение работы после очистки # Назначаем функции очистки для сигналов signal.signal(signal.SIGINT, lambda *_: cleanup()) signal.signal(signal.SIGTERM, lambda *_: cleanup()) # Парсер аргументов командной строки parser = argparse.ArgumentParser(description="Python launcher script.") parser.add_argument( "--test-socket", action="store_true", help="Запуск в режиме тестирования" ) parser.add_argument( "--bullet-gui", action="store_true", help="Вывод визуального pybullet" ) args = parser.parse_args() poetry_path = "poetry" # Установка команды для pybullet_server pybullet_command = [ poetry_path, "run", "python", "utils/pybullet_server.py", ] # Путь к исполняемому файлу # Если включен режим тестирования, добавляем флаг --test if args.bullet_gui: pybullet_command.append("--test") # Запуск pybullet_server.exe print("Запуск pybullet_server...") server_process = subprocess.Popen(pybullet_command) # Проверяем успешный запуск сервера if server_process.poll() is not None: print("Ошибка при запуске pybullet_server") sys.exit(1) # Если включен режим тестирования, запускаем test_socket_server.exe if args.test_socket: print("Запуск test_socket_server...") test_server_process = subprocess.Popen( [ poetry_path, "run", "python", "utils/test_socket_server.py", ] ) # Путь к исполняемому файлу # Проверка успешного запуска тестового сервера if test_server_process.poll() is not None: print("Ошибка при запуске test_socket_server") sys.exit(1) # Запуск основного скрипта main.exe в режиме тестирования subprocess.run( [ poetry_path, "run", "python", "main.py", "--mode", "test", ] ) # Путь к исполняемому файлу else: # Запуск основного скрипта main.exe subprocess.run( [ poetry_path, "run", "python", "main.py", ] ) # Путь к исполняемому файлу # Очистка после завершения cleanup()