modbus_test/run.py

123 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import subprocess
import argparse
import sys
import signal
import psutil
# Параметры для процессов
server_process = None
test_server_process = None
command_type = 'exe'
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"
)
parser.add_argument(
"--start-py", action="store_true", help="Запуск EXE или PY"
)
args = parser.parse_args()
if args.start_py:
command_type = 'local'
poetry_path = "poetry"
# Установка команды для pybullet_server
pybullet_command = [
poetry_path,
"run",
"python",
"utils/pybullet_server.py",
] if command_type == 'local' else 'pybullet_server.exe'
# Если включен режим тестирования, добавляем флаг --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 command_type == 'local' else 'test_socket_server.exe'
) # Путь к исполняемому файлу
# Проверка успешного запуска тестового сервера
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",
] if command_type == 'local' else 'main.exe --mode test'
) # Путь к исполняемому файлу
else:
# Запуск основного скрипта main.exe
subprocess.run(
[
poetry_path,
"run",
"python",
"main.py",
] if command_type == 'local' else 'main.exe'
) # Путь к исполняемому файлу
# Очистка после завершения
cleanup()