труба / поток выводит gnupg в tarfile в - PullRequest
0 голосов
/ 12 июня 2019

У меня есть следующий код, но, очевидно, это не настоящая потоковая передача. Это лучшее, что я смог найти, но сначала он читает весь входной файл в память. Я хочу передать его в модуль tarfile, не используя всю мою память при расшифровке огромных (> 100 ГБ файлов)

import tarfile, gnupg                                                                                                                                                                                                                                
gpg = gnupg.GPG(gnupghome='C:/Users/niels/.gnupg')                                                                         

with open('103330-013.tar.gpg', 'r') as input_file:                                                                                                                                                                                                   
    decrypted_data = gpg.decrypt(input_file.read(), passphrase='aaa')                                                       
    # decrypted_data.data contains the data                                                                                 
    decrypted_stream = io.BytesIO(decrypted_data.data)                                                                      

    tar = tarfile.open(decrypted_stream, mode='r|')                                                                                                                                                                                                 
    tar.extractall()                                                                                                                                                                                                                                
    tar.close()

1 Ответ

1 голос
/ 22 июня 2019

Очевидно, что вы не можете использовать реальную потоковую передачу с помощью модуля gpnupg, модуль gnupg всегда считывает весь вывод gnupg в память. Таким образом, чтобы использовать реальную потоковую передачу, вам нужно будет запустить программу gpg напрямую. Вот пример кода (без надлежащей обработки ошибок):

import subprocess
import tarfile

with open('103330-013.tar.gpg', 'r') as input_file:
   gpg = subprocess.Popen(("gpg", "--decrypt", "--homedir", 'C:/Users/niels/.gnupg', '--passphrase', 'aaa'), stdin=input_file, stdout=subprocess.PIPE)
   tar = tarfile.open(fileobj=gpg.stdout, mode="r|")
   tar.extractall()
   tar.close()
...