Внешний ввод в программу Python во время выполнения

1

Я создаю автоматизацию тестирования, которая использует приложение без каких-либо интерфейсов. Тем не менее, приложение вызывает пакетный скрипт, когда он меняет режимы, и поэтому я могу поймать переходы режима.

Я хочу сделать, чтобы пакетный скрипт предоставил вход для моего скрипта python (у меня есть машина состояния, работающая на python) во время выполнения. Таким образом, я могу контролировать состояние приложения с помощью python вместо пакетного файла.

Я использую аналогичную машину состояний для одной из Karn Saheb: https://dev.to/karn/building-a-simple-state-machine-in-python

Однако вместо изменения состояний статически, как:

device.on_event('event')

Я хочу, чтобы скрипт python сделал что-то похожее:

while(True):
    device.on_event(input()) # where the input is passed from the batch script:

REM state.bat
set CurrentState=%1
"magic code to pass CurrentState to python input()" %CurrentState%

Я вижу, что решением было бы запустить скрипт python из командного файла каждый раз, когда он вызывается с "событием", а затем сохраняет текущее событие в другом файле после завершения сценария python... Но я хочу избежать такого обработки и, скорее, оценить это во время выполнения.

Заранее спасибо!

  • 0
    Я нахожу установку трудно понять. Может быть, вы можете предоставить минимальный воспроизводимый пример, который высмеивает реальные вещи, чтобы лучше объяснить ситуацию?
  • 0
    Привет Alfe, упрощенная идея состоит в том, что у меня есть эта программа "черный ящик" (без интерфейса), которую я начинаю использовать обычные команды оболочки через python. Я хочу отслеживать, насколько далеко в процессе находится этот черный ящик (он выполняет компиляцию тестов, статический анализ кода, целевое тестирование и, в конце концов, создает отчет). Когда я запускаю этот черный ящик из python, я не знаю, когда он завершит тестирование, так как обратной связи нет. Однако при переходе от одного теста к другому, например, при статическом анализе кода для генерации отчета, он вызывает файл .bat с аргументом «Отчет».
Показать ещё 1 комментарий
Теги:
batch-file
input

1 ответ

0
Лучший ответ

Достаточно переносимый способ сделать это без уродливого опроса на временных файлах - использовать сокет: listen основной процесс и запустить пакетный файл (ы), запускать небольшую программу, которая подключается к серверу и записывает сообщение.

Здесь есть соображения безопасности: вы можете начать с прослушивания только интерфейса loopback, с последующей аутентификацией, если локальному компьютеру не следует доверять.

Если у вас есть более одного из этих процессов или если вам нужно обработать процесс умирания до того, как он выпустит свой следующий отчет, вам придется использовать потоки или что-то вроде select для объединения новостей из разных входных каналов (например, ожидание на дочернем для выхода из ожиданий новостей из следующего пакетного файла).

  • 0
    Мне нравится эта идея! Я немного сложнее, чем то, что я искал, однако, я хочу избежать, как вы говорите, «опрос временных файлов». Я порождаю где-то 1-10 из этих процессов черного ящика, но если основной процесс может прослушивать несколько сокетов / клиентов, я могу отличаться от процессов, основанных на PID или пути выполнения. Я буду искать и другие решения, но это кажется хорошим вариантом. Спасибо!
  • 0
    Я проверил это решение сейчас, и, похоже, оно работает нормально. У меня есть сервер, который управляет конечными автоматами для каждого «черного ящика», который запускает или изменяет состояние. Я запустил сервер как автономный модуль, чтобы не мешать основной программе, чтобы я мог продолжать выполнять другие действия во время выполнения тестов. Основная программа имеет клиента, который запрашивает все активные конечные автоматы и их состояния. Спасибо за идею :)
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню