Skip to content

Latest commit

 

History

History
78 lines (62 loc) · 4.41 KB

README.md

File metadata and controls

78 lines (62 loc) · 4.41 KB
Usage Release Development
MIT License PyPI version Build status
Python versions Tag Maintainability
pip install aiosubprocess This project uses calendar-based versioning scheme Test Coverage
Downloads This project uses the "black" style formatter for Python code

aiosubprocess

A zero-dependency async subprocess that keeps on getting stdout and stderr.

How to use

Example 1: Hello World

A classic Hello World. It prints Hello World! in the shell and redirects the stdout to print().

import asyncio
from aiosubprocess import Process

asyncio.get_event_loop().run_until_complete(
    Process("echo Hello World!", stdout=print).shell()
)
$> python ex1_minimal.py
[AIO Subprocess-0] Hello World!

Process finished with exit code 0

Example 2: Two Processes

One process writes to a file, and a second process logs the content of the file in real time.

import asyncio
from aiosubprocess import Process

loop = asyncio.get_event_loop()
reader = Process(
    """for i in {1..5}
    do
       echo "Hello $i World" > tempfile.log
       sleep 1
    done""",
    loop=loop,
    name="Writer",
)
writer = Process(
    "timeout --foreground 10s tail -f tempfile.log",
    loop=loop,
    name="Reader",
    expected_returncode=124,  # Because timeout is expected
)
awaitable_reader = reader.shell()
awaitable_writer = writer.shell()
gathered = asyncio.gather(awaitable_reader, awaitable_writer, loop=loop)
asyncio.get_event_loop().run_until_complete(gathered)
assert gathered.result() == [True, True]

Which does exactly this:

Example animation

Why?

There are many scenario where we need to keep an eye on a subprocess output. If we want to do so in realtime (and redirect it to logs or a GUI), the boilerplate is tedious.

The other solution is to wait for the subprocess to exit and read the stdout/stderr afterwards.

This library implements this boilerplate, so you don't have to.