Есть ли аналог модуля CalledProcessError в модуле asyncio? - PullRequest
0 голосов
/ 05 июня 2018

Есть ли в модуле asyncio аналог исключения CalledProcessError из модуля subprocess?

Я бы ожидал, что будет аналог,потому что модуль asyncio создает исключение TimeoutError для замены исключения TimeoutExpired из модуля subprocess.Но, похоже, его нет.

В качестве подвопроса: исключение CalledProcessError работает только с экземплярами класса Popen?Или он также работает с другими классами (например, Process из asyncio или Subprocess из tornado.process), которые реализуют (дочерние) функциональные возможности процесса?

Похоже, что исключение CalledProcessError может работать с экземплярами классов, аналогичными, но отличными от Popen.Например, на GitHub можно найти примеров людей, звонящих CalledProcessError с экземпляром класса Subprocess из tornado.process.

Обратите внимание, что в приведенном выше примере, хотя онверно, что tornado.process имеет псевдоним для subprocess.CalledProcessError, основанный на операторах import в верхней части файла, который является не вызываемым исключением;на самом деле вызывается subprocess.CalledProcessError.

Если CalledProcessError также работает с экземплярами класса Process из asyncio, то почему TimeoutExpired также не работает с экземплярами Process класс от asyncio?Другими словами, в asyncio, почему было необходимо создать новую версию (TimeoutError) исключения TimeoutExpired, но не необходимо для создания новой версии исключения CalledProcessError?

В конце дня исходный код для CalledProcessError не так уж сложен, поэтому, если бы я хотел создать дублированную версию для экземпляров класса Process из asyncio, я полагаю, что мог бы, но сначала хотелось бы попытаться избежать такого дублирования кода.

Примечание: Моя текущая рабочая ментальная модель заключается в том, что модуль "asyncio.subprocess нацеленделать все, что делает модуль subprocess, но асинхронно ".Поскольку эта ментальная модель неверна, этот вопрос, скорее всего, будет содержать в себе предвзятые / неправильные представления.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Нет такого исключения, нет.Реализация asyncio.subprocess должна рассматриваться как эквивалент subprocess.Popen().Из asyncio.subprocess.Process документации :

API класса Process был разработан так, чтобы быть близким к API класса subprocess.Popen [.]

Исключение CalledProcessError вызывается только функциями более высокого уровня в том же модуле (например, suprocess.run()), каждый из которых управляет Popen() под капотом.

Просто создайте свое собственное исключение, когда значение Process.returncode отличное от нуля.Вы можете повторно использовать CalledProcessError для этого, если хотите, все, что вам нужно, это контейнер для запуска команды, код возврата и строки stderr и stdout.Это все встроенные типы Python, ничего особенного subprocess.

0 голосов
/ 05 июня 2018

asyncio не содержит эквивалента для CalledProcessError, потому что он не содержит эквивалента для вещей, которые поднимают CalledProcessError.Не существует эквивалента для check_call, check_output, check_returncode или аргумента check для run.

...