卡在 python 子进程调用中

Stuck inside a python subprocess call

我正在尝试在 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')

未包含,但已导入密钥。

有什么我可以 add/remove 或做不同的事情来 1) 更好地了解主机系统(windows 服务器)和 2) 不 运行 无限期并报告有用的信息,说明为什么 运行ning 无限期地。

如果需要任何说明,请告诉我。

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

Note: Do not use stdout=PIPE or stderr=PIPE with this function. The child process will block if it generates enough output to a pipe to fill up the OS pipe buffer as the pipes are not being read from.

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

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

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

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