Как дождаться завершения Python subprocess.check_output()?

#python #subprocess #wait

#python #подпроцесс #подождите

Вопрос:

Я запускаю этот код в цикле Python 3.6:

 # previous code: copy certain files to the working folder
    shellCmd = "myCmd "   file1   " "   file2

# myCmd works on file1 and file2  
    result = subprocess.check_output(myCmd, shell=True)

# delete the files
 

Время от времени я получаю сбой, вызванный отказом в доступе к некоторым файлам. Я предполагаю, что подпроцесс выполняется в фоновом режиме, и цикл продолжается, порождая другие подпроцессы. Иногда это приводит к тому, что один подпроцесс пытается скопировать (или удалить) файлы, с которыми myCmd все еще занят в другом подпроцессе.

Как мне остановиться и дождаться завершения subprocess.check_output()?

Я видел этот подпроцесс.В Popen есть функция wait(), но мне нужна результирующая строка из процесса myCmd, поэтому я хочу использовать subprocess.check_output() .

Но любое решение, которое (а) даст мне строковый вывод myCmd и (б) обеспечит последовательное выполнение подпроцессов, в порядке.

Спасибо!

Ответ №1:

Ситуация, которую вы описываете, далека от удовлетворительной, потому что кажется, что несколько подпроцессов, если я правильно понимаю ваше описание, иногда создают условия гонки. Логично было бы, чтобы ваша программа считывала выходные данные из подпроцесса по мере их появления.

Если вы хотите лучше контролировать подпроцессы, вам безопаснее использовать subprocess.Popen объекты, которые имеют более удобный интерфейс. Читая выходные данные одной команды, пока не дойдете до конца файла, вы знаете, что не будете создавать дополнительные процессы для вмешательства. Отправьте стандартный вывод команды в канал с stdout=subprocess.PIPE помощью, а затем вы можете прочитать стандартный вывод процесса как атрибут Popen объекта stdout , как показано ниже.

 >>> process = subprocess.Popen("getmac", stdout=subprocess.PIPE)
>>> for line in process.stdout:
...     print(line)
...
b'rn'
b'Physical Address    Transport Name                                            rn'
b'=================== ==========================================================rn'
b'94-C6-91-1B-56-A4   \Device\Tcpip_{023B9717-B878-43D4-A0BE-28A4295785FA}      rn'
b'68-EC-C5-52-14-AD   Media disconnected                                        rn'
b'68-EC-C5-52-14-B1   Media disconnected                                        rn'
b'0A-00-27-00-00-0E   \Device\Tcpip_{89DD54F9-0C99-4F5B-8376-45598FB4C0FD}      rn'
>>>
 

Комментарии:

1. Спасибо! Возможно (вероятно? …) что-то еще происходит, как указано в tripleee, но использование Popen позволяет мне вызывать wait() для двойной уверенности.

Ответ №2:

Нет, check_output возвращается только после завершения выполнения подпроцесса. Ваша проблема вызвана чем-то другим.