2010-06-08 2 views
16

Я пытаюсь написать небольшое приложение, которое использует модуль subprocess.Использование подпроцесса wait() и poll()

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

Обработка. Пожалуйста, подождите ...
Выход Foo()

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

ответ

16

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

Edit:

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

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

</Edit>

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

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

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

+0

Я использую связь(). Но я не понимаю, как я могу вернуть код возврата во время выполнения процесса. – user225312

+0

Я решил это, выполнив это: if process.poll() - None: print 'Working' – user225312

+4

Этот ответ неверен. Проверить @ onlynone ответ –

23

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

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

Popen.poll()

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

Popen.wait()

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

Смежные вопросы