陷入python子进程调用

时间:2017-04-11 21:01:26

标签: python gnupg pgp

我正在尝试在Windows 2012服务器上解密带有gpg可执行文件的文件。目前,该脚本访问“try”块,但随后无限期地停留在那里。该文件的大小约为500mb,所以应该采取的任何措施< 10分钟解密。我让它运行的最长时间是一个小时。以下是此代码:

# decrypt the pgp file
comm = (gpg + ' --batch --passphrase passphrase --homedir='+current_path
           +' -o ' + zip_name +' --decrypt ' + file_name)

try:
    subp = subprocess.check_call(comm, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
    stdout_data, stderr_data = subp.communicate()
    print stdout_data, stderr_data
except subprocess.CalledProcessError as e:
    print e.output
    logger.update('Error', process, runtime=0, error=e)
    raise Exception('Error Decrypting File')

未包含但已导入密钥。

有什么我可以添加/删除或做不同的事情1)更好地了解主机系统(Windows服务器)内发生的事情和2)无法无限期运行并报告有用的信息为什么它无限期地运行。

如果需要澄清,请告诉我。

1 个答案:

答案 0 :(得分:3)

来自python的subprocess.check_call()文档:

  

注意:请勿对此功能使用stdout=PIPEstderr=PIPE。子进程将阻塞它是否为管道生成足够的输出以填充OS管道缓冲区,因为没有读取管道。

考虑到您正在尝试解密500MB,我认为可以肯定地说您将达到管道大小限制。我建议你用一个打开的文件描述符或现有的文件对象替换PIPE

顺便说一下,我对你构建命令行的方式感到有点惊讶,我的理解是subprocess.check_call需要一个字符串列表,而不是一个字符串本身。

command = [gpg, "--batch", "--passphrase passphrase", "--homedir=current_path",
           "-o", "zip_name", "--decrypt", file_name]

从版本3.3开始,在subprocess模块的许多功能中添加了超时选项。您可能会发现调试问题很有用。