2015-02-02 3 views
4

Я пишу небольшой скрипт, чтобы поочередно проходить через каталог и запускать команду в подкаталогах в нем.Python subprocess.Popen() wait for complete

У меня возникает проблема с Popen(), что он будет проходить через каталоги и запускать нужную команду, не дожидаясь окончания предыдущего. то есть

for dir in dirs: 
    #run command on the directory here. 

он запускает команду для каждого каталога, не заботясь об этом впоследствии. Я хочу, чтобы он подождал, пока текущий закончится, а затем начнется дальше. Инструмент, который я использую в каталогах, - Log2timeline от SANS SIFT, который занимает довольно много времени и производит довольно много результатов. Я не забочусь о выходе, я просто хочу, чтобы программа подождала, прежде чем начинать следующий.

Каков наилучший способ для этого?

Спасибо!

+0

несвязанный: отказаться от подпроцесс выход правильно, см [Как скрыть выход для подпроцесса в Python 2.7] (http://stackoverflow.com/q/11269575/4279) – jfs

ответ

17

Использование Popen.wait :

process = subprocess.Popen(["your_cmd"]...) 
process.wait() 

Или check_output, check_call, которые все ждут кода возврата в зависимости от того, что вы хотите сделать, и версии python.

Если вы используете python> = 2.7, и вы не заботитесь о выходе, просто используйте check_call.

Вы также можете использовать call, но это не будет поднимать какие-либо ошибки, если у вас есть ненулевой код возврата, который может или не может быть желательным

4
subprocess.check_output(...) 

перекроет ... и может быть использован вместо Popen

Однако, если вы установите на Popen

subprocess.Popen(...).communicate() 

будет также блокировать, пока процесс не возвращает

+1

ни 'check_output', ни' .communicate() 'было бы полезно здесь: *« [subprocess] производит довольно немного вывода. Я не забочусь о выходе «*. Вместо этого следует использовать 'call()' или 'check_call()'. – jfs

+0

ahh good point: P thats, что я получаю за то, что не читаю ... что сказал ... выход просто выкинут в этих примерах в любом случае –