#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
возвращается только после завершения выполнения подпроцесса. Ваша проблема вызвана чем-то другим.