Есть ли аналог функции `CalledProcessError` в модуле` asyncio`?

roomwithaview спросил: 12 мая 2018 в 03:54 в: python

Есть ли в модуле 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 в верхней части файла, который является not вызываемое исключение; это действительно subprocess.CalledProcessError.

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

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

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


2 ответа

Есть решение
user2357112 ответил: 12 мая 2018 в 04:04

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

Martijn Pieters ответил: 12 мая 2018 в 04:10

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

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

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

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

roomwithaview ответил: 12 мая 2018 в 06:53
Я бы поднял голову, если бы у меня была достаточная репутация. Этот и другой ответ очень полезны; для этого ответа мне нравится последняя часть, разъясняющая, как написать свое исключение для этого случая.