You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用python-gnupg解密GPG消息时遇OSError:无法运行gpg

解决GPG解密工具的PermissionError和OSError问题

你的问题核心出在GPG命令路径获取失败上,咱们一步步拆解问题并修复:

问题根源

你用os.popen("which gpg").read().strip()来获取gpg的执行路径,但这个方式存在两个明显隐患:

  1. Python运行环境的PATH变量可能和终端环境不一致,导致which gpg返回空字符串;
  2. os.popen是比较老旧的进程调用方法,输出处理容易出现异常。

当路径为空时,gnupg.GPG()尝试调用空路径的可执行文件,自然触发PermissionError,进而引发OSError提示无法运行gpg。

修复方案

1. 先确认gpg的安装状态和路径

先在终端手动运行以下命令,确认gpg是否已安装并获取准确路径:

gpg --version
which gpg

记下输出的绝对路径(比如/usr/bin/gpg或/usr/local/bin/gpg)。

2. 改用更可靠的路径获取方式

用Python标准库的shutil.which()替代os.popen,它能更稳定地查找系统中的可执行文件。修改后的代码如下:

import gnupg
import shutil

message = '''-----BEGIN PGP MESSAGE-----
Version: GnuPG v2
jA0ECQMCVady3RUyJw3X0kcBF+zdkfZOMhISoYBRwR3uk3vNv+TEg+rJnp4/yYIS
pEoI2S82cDiCNBIVAYWB8WKPtH2R2YSussKhpSJ4mFgqyOA01uwroA==
=KvJQ
-----END PGP MESSAGE-----
'''
passphrase = 'topsecret'

# 安全获取gpg可执行文件路径
gpg_path = shutil.which('gpg')
if not gpg_path:
    raise FileNotFoundError("未找到gpg命令,请先安装GnuPG工具")

# 初始化GPG对象
gpg = gnupg.GPG(gpg_path)
# 执行解密
decrypted_data = str(gpg.decrypt(message, passphrase=passphrase))
print(decrypted_data)

3. 兜底方案(如果自动查找仍失败)

如果还是出现路径问题,可以直接手动指定gpg的绝对路径,跳过自动查找步骤:

# 替换成你终端里查到的实际路径
gpg = gnupg.GPG("/usr/bin/gpg")

内容的提问来源于stack exchange,提问作者zaddyn00b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:17:17