소개
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
모듈을 사용하면 다른 프로그램이나 명령어를 실행하고 결과를 캡처할 수 있습니다. 만약 프로그램이나 명령어가 비동기적으로 실행되어야 하는 경우, asyncio
와 subprocess
를 함께 사용하여 비동기식으로 subprocess
를 실행할 수 있습니다. 이를 통해 병렬로 여러 프로세스를 실행하고 결과를 비동기적으로 처리할 수 있습니다.