[파이썬] subprocess 비동기로 `subprocess` 실행하기

소개

Python의 subprocess 모듈은 다른 프로그램이나 명령어를 실행하고 그 결과를 캡처하는 데 사용됩니다. 기본적으로 subprocess는 동기적으로 작동하며, 호출된 프로세스의 결과를 기다린 다음 결과를 반환합니다. 그러나 때로는 프로그램이나 명령어의 실행이 끝나기를 기다리는 것이 아닌, 비동기로 실행해야 할 수도 있습니다.

이 글에서는 Python에서 subprocess 모듈을 사용하여 비동기적으로 프로세스를 실행하는 방법에 대해 알아보겠습니다.

비동기식으로 subprocess 실행하기

Python 3.5부터는 subprocess 모듈에서 비동기적으로 프로세스를 실행할 수 있는 asyncio 모듈의 지원이 추가되었습니다. 이를 사용하면 subprocess를 비동기적으로 사용할 수 있습니다. 아래는 비동기 방식으로 subprocess를 실행하는 예제 코드입니다.

import asyncio
import subprocess

async def run_command(cmd):
    process = await asyncio.create_subprocess_shell(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = await process.communicate()
    
    return stdout.decode(), stderr.decode()

async def main():
    # 비동기로 실행할 명령어 리스트
    commands = [
        "ls -l",
        "echo 'Hello, World!'",
        "cat test.txt"
    ]
    
    for cmd in commands:
        stdout, stderr = await run_command(cmd)
        
        print(f"Command: {cmd}")
        print(f"---stdout---")
        print(stdout)
        print(f"---stderr---")
        print(stderr)
        print()

# 비동기 루프 실행
asyncio.run(main())

위의 코드에서 run_command는 주어진 명령어를 실행하고 결과를 반환하는 비동기 함수입니다. main 함수에서는 실행할 명령어 리스트를 정의하고 for 루프를 통해 하나씩 실행하고 결과를 출력합니다.

asyncio.run(main())은 비동기 루프를 실행하고 main 함수를 호출하는 부분입니다. 이를 통해 비동기 방식으로 프로세스를 실행할 수 있습니다.

결론

Python의 subprocess 모듈을 사용하면 다른 프로그램이나 명령어를 실행하고 결과를 캡처할 수 있습니다. 만약 프로그램이나 명령어가 비동기적으로 실행되어야 하는 경우, asynciosubprocess를 함께 사용하여 비동기식으로 subprocess를 실행할 수 있습니다. 이를 통해 병렬로 여러 프로세스를 실행하고 결과를 비동기적으로 처리할 수 있습니다.