Creative stdin и обработка ошибок для python - PullRequest
0 голосов
/ 13 октября 2018

Я использую стороннюю программу на Windows10 - назовите ее SuckySoftware.exe.

Эта программа может запускать скрипт на Python и делать другие вещи.

Когда он запускает скрипт на Python, к сожалению, я не запускаю командное окно.Это создает три проблемы:

1) Я не могу дать ему вход.Например, использование python3 и наличие «input ()» в качестве одной из команд приводит к зависанию SuckySoftware.exe, поскольку он ожидает ввода в какое-то несуществующее командное окно.

2) Я не могу получитьвыход.Так что "print ('hello')" нигде не отображается

3) Нет обработки ошибок.Так что, если у меня в коде Python есть ValueError, он молча завершается сбоем в этой строке и не выполняет остальную часть Python.

Я решил # 2, выполнив:

sys.stdout = open(logfile, 'wb', 0)
sys.stdout.write('hello'.encode('utf-8'))

и затем используя mTail для мониторинга файла журнала в режиме реального времени.

Я не могу понять, какрешить 1 или 3.

Для 1 мне интересно, есть ли простой способ запуска простого графического интерфейса с одним текстовым полем.Всякий раз, когда в моем лог-файле отображается «Пожалуйста, введите значение», я могу ввести его в это текстовое поле и нажать «Ввод», и оно будет перенесено на стандартный ввод.Однако это кажется слишком сложным.

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

Идеи

1 Ответ

0 голосов
/ 14 октября 2018

Сначала откройте файл как sys.stderr, так как вывод там может быть полезен в любом случае.

  1. Самый простой, самый переносимый метод - установить sys.stdin в (TCP,aka SOCK_STREAM) подключение сокета к другому процессу.
  2. Вы также можете использовать такие сокеты, как sys.stdout и / или sys.stderr, хотя тогда вспомогательный процесс должен использовать select для обработкинесколько потоков без тупиков.(Возможно, вы захотите использовать обертку как sys.stderr, чтобы сохранить ее небуферизованный статус.)
  3. Назначить функцию sys.excepthook, которая сообщает об исключении через (ваше) stderr.(Возможно, что-то уже назначает такую ​​функцию, поскольку ничего не отображается на sys.stderr как есть.)
...