Как ждать завершения Python subprocess.check_output ()? - PullRequest
1 голос
/ 15 апреля 2019

Я запускаю этот код в цикле - в 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 ()?

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

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...