如何用python-gnupg解密时保留嵌入的原始文件名?
解决python-gnupg解密时保留嵌入原始文件名的问题
你遇到的问题核心在于decrypt_file方法默认会给gpg传递--decrypt参数,这个参数会强制把解密内容输出到stdout,哪怕你加了--use-embedded-filename也不会自动保存到原始文件——这和你在命令行里执行gpg --decrypt --use-embedded-filename test.tim.gpg的效果一致,只会打印内容而不保存。
而命令行里去掉--decrypt只使用--use-embedded-filename就能自动保存到原始文件名,所以我们需要在代码里让python-gnupg调用gpg时不包含--decrypt参数。
解决方案:自定义command参数
decrypt_file方法允许通过command参数指定要传递给gpg的核心命令,而不是使用默认的['--decrypt']。我们只需要把这个参数设置为['--use-embedded-filename'],就能实现和目标命令行一样的效果:
import gnupg import os # 初始化gpg对象(根据你的环境调整参数) gpg = gnupg.GPG() encrypted_file = 'test.tim.gpg' with open(encrypted_file, 'rb') as fh: # 替换默认的--decrypt命令,使用--use-embedded-filename status = gpg.decrypt_file( fh, command=['--use-embedded-filename'] ) # 检查解密状态并获取原始文件名 if status.ok: print(f"解密完成!文件已保存为:{status.filename}") else: print(f"解密出错:{status.stderr}")
额外说明
- 执行成功后,
status.filename属性会返回嵌入的原始文件名,你可以用这个值做后续的文件操作。 - 不需要指定
output参数,gpg会自动使用嵌入的文件名保存解密后的文件,和你在命令行里的操作逻辑完全一致。
内容的提问来源于stack exchange,提问作者Timmah
相关产品推荐
相关产品推荐

