Есть асинхронное приложение, в котором нужно вызвать произвольную shell-комманду и получить ее вывод, при этом не заблокировать остальные потоки.
Пока что я додумался только до этого:
from subprocess import Popen, TimeoutExpired, PIPE
async def call_process(command: str, timeout: int = 5) -> None:
try:
proc = Popen(command, stdout=PIPE, stderr=PIPE, shell=True)
stdout, stderr = proc.communicate(timeout=timeout)
exitcode = proc.returncode
except TimeoutExpired:
print(f'Command {command} timed out ({timeout}s)')
else:
print(
f'Exitcode: {exitcode}\n' + (
"STDERR: " + stderr.decode()
if stderr else "STDOUT: " + stdout.decode() if stdout else ''
)
)
Проблема этого кода в том, что пока оно работает, все приложение не отвечает до того момента, пока команда не выполнится, или не истечет время ожидания.
Я пробовал также
multithreading
, но так как функция
асинхронная, то отрабатывать не хочет.
Также пробовал
subprocess.check_output
, результат такой же как и от
Popen
Предвидя ответы "сделай функцию синхронной" отвечаю: нельзя, вместо print там вызов async функции.
P.S.: И да, я гуглил и читал доки
P.P.S:
loop.run_in_executor()
не сработал