[파이썬] subprocess `subprocess.pass_fds`: 파일 디스크립터 전달하기

파이썬의 subprocess 모듈을 사용하면 다른 프로세스를 실행하고 상호작용할 수 있습니다. subprocess 모듈에는 다양한 함수와 기능이 있지만, 여기서는 pass_fds라는 속성에 대해 알아보겠습니다.

파일 디스크립터를 전달해야 하는 경우가 있습니다. 예를 들어, 부모 프로세스가 자식 프로세스에게 특정 파일을 전달하고 싶을 때 사용할 수 있습니다. 이때 pass_fds 속성을 사용하면 파일 디스크립터를 자식 프로세스로 전달할 수 있습니다.

pass_fds 속성 사용

subprocess 모듈의 Popen 클래스를 사용하여 자식 프로세스를 생성할 수 있습니다. pass_fds 속성을 Popen 생성자의 인자로 전달하면 됩니다. 이 속성은 전달하고자 하는 파일 디스크립터의 목록을 받습니다.

다음은 파일 디스크립터 0, 1, 2를 자식 프로세스로 전달하는 예제입니다:

import subprocess

# 부모 프로세스
filename = 'example.txt'
with open(filename, "w") as file:
    # 자식 프로세스 실행
    subprocess.Popen(["child_process.py"], pass_fds=[file.fileno()])

위의 예제에서 child_process.py는 자식 프로세스를 실행하는 파일의 이름입니다. pass_fds에는 파일 오픈한 후 .fileno() 메소드를 호출하여 파일 디스크립터를 전달하고 있습니다.

자식 프로세스에서 파일 디스크립터 사용하기

자식 프로세스에서 전달받은 파일 디스크립터를 사용하려면, sys 모듈의 stdin, stdout, stderr와 같은 속성을 사용하여 파일 디스크립터에 액세스할 수 있습니다.

예를 들어, 다음은 자식 프로세스에서 전달받은 파일 디스크립터를 사용하여 파일에 쓰는 예제입니다:

import sys

# 파일 디스크립터는 sys.stdin, sys.stdout, sys.stderr에 저장됨
with open(sys.stdin.fileno(), 'r') as infile:
    with open(sys.stdout.fileno(), 'w') as outfile:
        # infile에서 데이터를 읽어 outfile에 쓰기
        data = infile.read()
        outfile.write(data)

위의 예제에서는 sys.stdin.fileno()를 호출하여 전달받은 파일 디스크립터를 stdin으로 사용하고, sys.stdout.fileno()을 호출하여 파일 디스크립터를 stdout으로 사용합니다. 이후에는 파일을 읽고 쓰는 것과 동일한 방식으로 데이터를 처리할 수 있습니다.

결론

subprocess.pass_fds를 사용하면 부모 프로세스와 자식 프로세스 간에 파일 디스크립터를 전달할 수 있습니다. 이를 통해 다른 프로세스와의 상호작용이 필요한 복잡한 작업을 수행할 수 있습니다. 위의 예제를 참고하면서 자신의 프로젝트에 subprocess.pass_fds를 활용해보세요.