복붙노트

[PYTHON] 파이썬 서브 프로세스의 파일 기술자 3에 쓴다. 객체를 열어 라.

PYTHON

파이썬 서브 프로세스의 파일 기술자 3에 쓴다. 객체를 열어 라.

하위 프로세스의 파일 설명자 3에 어떻게 쓰는지. 개체를 열었습니까?

파이썬 (명명 된 파이프를 사용하지 않고)을 사용하여 다음 쉘 명령에서 리디렉션을 수행하려고합니다.

$ gpg --passphrase-fd 3 -c 3<passphrase.txt < filename.txt > filename.gpg

해결법

  1. ==============================

    1.하위 프로세스 proc는 상위 프로세스에서 열린 파일 설명자를 상속합니다. 따라서 os.open을 사용하여 passphrase.txt를 열고 관련 파일 설명자를 얻을 수 있습니다. 그런 다음 해당 파일 설명자를 사용하는 명령을 생성 할 수 있습니다.

    하위 프로세스 proc는 상위 프로세스에서 열린 파일 설명자를 상속합니다. 따라서 os.open을 사용하여 passphrase.txt를 열고 관련 파일 설명자를 얻을 수 있습니다. 그런 다음 해당 파일 설명자를 사용하는 명령을 생성 할 수 있습니다.

    import subprocess
    import shlex
    import os
    
    fd=os.open('passphrase.txt',os.O_RDONLY)
    cmd='gpg --passphrase-fd {fd} -c'.format(fd=fd)
    with open('filename.txt','r') as stdin_fh:
        with open('filename.gpg','w') as stdout_fh:        
            proc=subprocess.Popen(shlex.split(cmd),
                                  stdin=stdin_fh,
                                  stdout=stdout_fh)        
            proc.communicate()
    os.close(fd)
    

    파일 대신 파이프에서 읽으려면 os.pipe를 사용할 수 있습니다.

    import subprocess
    import shlex
    import os
    
    PASSPHRASE='...'
    
    in_fd,out_fd=os.pipe()
    os.write(out_fd,PASSPHRASE)
    os.close(out_fd)
    cmd='gpg --passphrase-fd {fd} -c'.format(fd=in_fd)
    with open('filename.txt','r') as stdin_fh:
        with open('filename.gpg','w') as stdout_fh:        
            proc=subprocess.Popen(shlex.split(cmd),
                                  stdin=stdin_fh,
                                  stdout=stdout_fh )        
            proc.communicate()
    os.close(in_fd)
    
  2. from https://stackoverflow.com/questions/6050187/write-to-file-descriptor-3-of-a-python-subprocess-popen-object by cc-by-sa and MIT license