-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathaioshell.py
31 lines (26 loc) · 983 Bytes
/
aioshell.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import asyncio
from asyncio.subprocess import PIPE, STDOUT
class Result:
def __init__(self, status, stdout, stderr):
self.status = status
self._stdout = stdout or ""
self._stderr = stderr or ""
if stdout is not None:
self.stdout = stdout.decode("utf-8")
else:
self.stdout = None
if stderr is not None:
self.stderr = stderr.decode("utf-8")
else:
self.stderr = None
def __repr__(self):
return f"<Result status={self.status} stdout={len(self._stdout)} stderr={len(self._stderr)}>\n{self._stdout}"
async def run(shell_command):
p = await asyncio.create_subprocess_shell(shell_command,
stdin=PIPE, stdout=PIPE, stderr=STDOUT)
stdout, stderr = await p.communicate()
code = p.returncode
print(f'[{shell_command!r} exited with {code}]')
if stderr:
print(f'[stderr]\n{stderr.decode()}')
return Result(code, stdout, stderr)