Я пытаюсь записать небольшое приложение, которое использует subprocess
модуль.
Моя программа называет внешнюю команду Bash, которая занимает время для обработки. В это время я хотел бы показать пользователю ряд сообщений как это:
Обработка.Подождите, пожалуйста...
Вывод является нечто ()
Как я могу сделать это использование Popen.wait()
или Popen.poll()
. Я считал, что должен использовать Popen.returncode
, но как я могу заставить это активно проверять состояние, я не знаю.
И 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.