Подтвердить что ты не робот

Использование подпроцессов wait() и poll()

Я пытаюсь написать небольшое приложение, которое использует модуль subprocess.

Моя программа вызывает внешнюю команду Bash, которая занимает некоторое время для обработки. В течение этого времени я хотел бы показать пользователю серию сообщений вроде этого:

Обработка. Подождите...
Вывод: foo()

Как это сделать, используя Popen.wait() или Popen.poll(). Я прочитал, что мне нужно использовать Popen.returncode, но как я могу заставить его активно проверять состояние, я не знаю.

4b9b3361

Ответ 1

Оба wait() (с указанным timeout) и poll() return None, если процесс еще не завершен, и что-то другое, если процесс завершился (я думаю, что целое число, код выхода, надеюсь, 0).

Изменить:

wait() и poll() имеют различное поведение:

  • wait (без аргумента таймаута) блокирует и ждет завершения процесса.
  • wait с аргументом timeout будет ждать timeout секунд для завершения процесса. Если он не будет завершен, он выкинет исключение TimeoutExpired. Если вы поймаете исключение, вам будет предложено продолжить или снова wait.
  • poll всегда возвращается немедленно. Он эффективно выполняет ожидание с тайм-аутом 0, ловит любое исключение и возвращает None, если процесс не завершился.
  • При использовании wait или poll, если процесс завершится, будет установлен popen-объект returncode (в противном случае it None - вы можете проверить это так же легко, как вызов wait или poll), а возвращаемое значение из функции также будет кодом возврата процесса.

</Правкa >

Итак, я думаю, вы должны сделать что-то вроде:

while myprocess.poll() is None:
    print("Still working...")
    # sleep a while

Имейте в виду, что если bash script создает много выходных данных, вы должны использовать communicate() или что-то подобное, чтобы предотвратить добавление stdout или stderr.

Ответ 2

@extraneon ответ немного назад. Оба wait() и poll() возвращают код выхода процесса, если процесс завершен. Метод poll() вернет None, если процесс все еще запущен, и метод wait() будет заблокирован до завершения процесса:

Ознакомьтесь со следующей страницей: https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

Проверьте, завершился ли дочерний процесс. Установить и вернуть атрибут returncode.

Popen.wait()

Дождитесь завершения дочернего процесса. Установить и вернуть атрибут returncode.