🟢 Потоки введення/виведення. Практика.
У Python для створення підпроцесів використовується бібліотека subprocess.
Вона дозволяє запускати програми та працювати з їхніми потоками введення/виведення.
subprocess добре підходить для простих випадків з синхронном кодом.
Але цікавіше розглянути асинхронний приклад з asyncio, який працює одразу з усіма трьома потоками введення/виведення.
Ідея проста: запускаємо Python у інтерактивному режимі та виконуємо дві операції — 2+2 і 1/0.
import asyncio
import sys
async def read_stream(name: str, stream: asyncio.StreamReader):
while data := await stream.readline():
line = data.decode("utf8").rstrip()
print(f"[{name}]", line)
async def main():
process = await asyncio.create_subprocess_exec(
sys.executable, "-i", # python -i
stdin=asyncio.subprocess.PIPE,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout_task = asyncio.create_task(
read_stream("stdout", process.stdout),
)
stderr_task = asyncio.create_task(
read_stream("stderr", process.stderr),
)
process.stdin.write(b"2+2\n")
await process.stdin.drain()
process.stdin.write(b"1/0\n")
await process.stdin.drain()
process.stdin.write(b"exit()\n")
await process.stdin.drain()
await process.wait() # Чекаємо завершення підпроцесу
Вивід у консоль:
[stderr] Python 3.11.6 (tags/v3.11.6:8b6ee5b, Oct 2 2023, 14:57:12) [MSC v.1935 64 bit (AMD64)] on win32
[stderr] Type "help", "copyright", "credits" or "license" for more information.
[stdout] 4
[stderr] >>> >>> Traceback (most recent call last):
[stderr] File "<stdin>", line 1, in <module>
[stderr] ZeroDivisionError: division by zero
[stderr] >>>
Як бачимо ми отримали текст окремо stdout і окремо stderr.
Звісно аналогічним чином ми можемо запускати системі утіліти або інші програми написані на інших мовах програмування — це простір для автоматизації.
Але трохи дивно чому python пише текст привітання саме у stderr
1 · 721 · پیام🟢 Потоки введення/виведення. Практика.
30 دسامبر 2025در همان حوالی فید
Pاین پیام
P