管道/流gnupg输出到tarfile中

时间:2019-06-12 18:16:52

标签: python stream pipe tar

我有以下代码,但显然这不是真正的流式传输。这是我能找到的最好的方法,但是它首先将整个输入文件读入内存。解密巨大的(> 100Gb文件)时,我想将其流式传输到tarfile模块而不使用我的所有内存

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 个答案:

答案 0 :(得分:1)

显然,您不能使用通过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()