gpg –passphrase-fd не работает с подпроцессом python 3

Следующий скрипт encrypt_me.py ( измененный из другого сообщения ) шифрует себя с помощью gpg и выводит зашифрованный текст в бронированной форме.

Однако он работает только на python2.7, но не на python3? Вы знаете, что не так, когда он работает на python3?

 import subprocess import shlex import os import sys in_fd, out_fd = os.pipe() passphrase = 'passsssphrase' os.write(out_fd, passphrase.encode('utf-8')) os.close(out_fd) cmd = 'gpg --passphrase-fd {fd} -c --armor'.format(fd=in_fd) with open(__file__,'r') as stdin_fh: proc=subprocess.Popen(shlex.split(cmd), stdin=stdin_fh, stdout=sys.stdout) proc.communicate() os.close(in_fd) 

С python2.7:

 $ python encrypt_me.py Reading passphrase from file descriptor 3 -----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.12 (GNU/Linux) jA0EAwMCXrbnOPX+CipgycBD3ErAKmba6UvtA35mjomOlbiOHX2M0bULbV+v8q8U AJ+sTQcFZK+NoauMgUFm39/ZcNoI7W5u78x8dj5B1N6jLk11C7MgmkNmT5CiliQO kl/el0fDAMnksrqGFpUC6+4ECOTJPpj0Z/Cn/3/62kLHkkbAxs+wyS8lGxXEIEKH XFl3OLRlVmCbvtwzrNMFLiD/St6NHu3Wh9S2xt8fe0PAEAZoYlWWx8lnEQEKewq9 EzLlkLldZaDNja3ePzWZ8Z6AeDtowBa8kj+8x/HjxfKLGheBBNQuaeBdcSHgE/OW esS/tEesQUlfUgqrZc2uBalLTV9xwyIpcV4cg8BubPWFCcBrDQ== =iziW -----END PGP MESSAGE----- 

С python3:

 $ python3 encrypt_me.py Reading passphrase from file descriptor 3 ... gpg: error creating passphrase: invalid passphrase gpg: symmetric encryption of `[stdin]' failed: invalid passphrase 

close_fds=True в системах POSIX на Python 3. Используйте pass_fds для передачи дескриптора файла входного файла:

 #!/usr/bin/env python3 import os import shlex import sys from subprocess import Popen passphrase = 'passsssphrase' file_to_encrypt = sys.argv[1] if len(sys.argv) > 1 else 'encrypt_me.py' in_fd, out_fd = os.pipe() cmd = 'gpg --passphrase-fd {fd} -c --armor -o -'.format(fd=in_fd) with Popen(shlex.split(cmd) + [file_to_encrypt], pass_fds=[in_fd]): os.close(in_fd) # unused in the parent with open(out_fd, 'w', encoding='utf-8') as out_file: out_file.write(passphrase) 

Вы также можете передать кодовую фразу через stdin:

 #!/usr/bin/env python3 import sys from subprocess import PIPE, Popen passphrase = 'passsssphrase' file_to_encrypt = sys.argv[1] if len(sys.argv) > 1 else __file__ cmd = 'gpg --passphrase-fd 0 -c --armor -o -'.split() with Popen(cmd + [file_to_encrypt], stdin=PIPE) as process: process.stdin.write(passphrase.encode('utf-8'))