Используя подпроцесс ожидают () и опрос ()

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

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

Обработка.Подождите, пожалуйста...
Вывод является нечто ()

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

21
задан rypel 22 May 2013 в 12:00
поделиться

1 ответ

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

Edit:

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

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

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

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

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

27
ответ дан 29 November 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: