使用python-gnupg时出现“OSError: Unable to run gpg () - it may not be available.”错误

4

我正在尝试制作一个简单的工具来解密GPG信息,但是我一直在解密消息时遇到错误,我不知道问题出在哪里。

以下是代码:

import gnupg
import os

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

passphrase = 'topsecret'

gpg = gnupg.GPG(os.popen("which gpg").read().strip())

decrypted_data = str(gnupg.decrypt(message, passphrase=passphrase))

print(decrypted_data) 

这里是错误信息:

PermissionError: [Errno 13] Permission denied: ''

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 29, in <module>
    gpg = gnupg.GPG(os.popen("which gpg").read().strip())
  File "/Users/***/PycharmProjects/untitled8/venv/lib/python3.6/site-packages/gnupg.py", line 849, in __init__
    raise OSError(msg)
OSError: Unable to run gpg () - it may not be available.
2个回答

3
python-gnupg 软件包要求您必须安装 gpg 可执行文件并使其可用。
根据 部署要求 的文档:

除了最新版本的 Python 外,使用此模块需要您可以访问兼容的 GnuPG 可执行文件。本系统已在 Windows 和 Ubuntu 上测试过 GnuPG v1.4.9 版本。在 Linux 平台上,通常可以通过发行版软件包管理器(例如 Debian/Ubuntu 上的 apt-get)进行安装。Windows 二进制文件可以在这里下载 - 使用其中一个 gnupg-w32cli-1.4.x.exe 安装程序是最简单的部署选项。

您收到的错误非常明确:

OSError: 无法运行 gpg() - 可能不可用。

这是由此引起的:
os.popen("which gpg").read().strip()

尝试在终端/控制台中运行which gpg。如果您没有安装gpgwhich gpg将求值为空字符串'',那么整行代码将求值为空字符串''。这实际上与没有任何变化相同。
gpg = gnupg.GPG('')

这将导致相同的错误,表明找不到 gpg 可执行文件。

因此,基本上您需要先安装 gpg

如果您已经安装了 gpg ,但由于某种原因 which gpg 找不到它,您也可以传递一个 gpgbinary 参数

gpg = gnupg.GPG(gpgbinary="/usr/local/bin/gpg")

2
谢谢!我需要做一个小改变,就是将“gpg”更改为“gpg2”。 gpg = gnupg.GPG(gpgbinary="/usr/local/bin/gpg2") - Douglas Daly

0

我花了好几个小时尝试解决这个问题,因为提出的各种解决方案都不起作用。

我找到了两个解决方案:

首先,您需要在计算机上查找gpg文件,有多种选择方法

  • 您可以打开命令行并键入 gpg --version,您会看到类似于以下内容的结果(如果您没有看到,您需要从官方网站下载GnuPG):
gpg (GnuPG) 2.3.8
libgcrypt 1.10.1
Copyright (C) 2021 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: C:\Users\USERNAME\AppData\Roaming\gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
AEAD: EAX, OCB
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
  • 其中Home是我们要找的文件夹。前往该路径并查看是否有gpg,如果有那就是路径。
  • 如果你没有找到gpg文件,可以在C:\Users\USERNAME\AppData\Local\gnupg\bin中查找,我就是在那里找到的。

找到路径后,您必须将该路径添加到系统环境变量中

  • 根据您使用的系统不同,该过程也会有所不同。您可以查看其他讨论来了解该过程。

  • 完成此操作后,您的程序应该可以正常运行

如果还不行,您可以尝试以下方法:

gpg = gnupg.GPG(gpgbinary="C:\\Users\\USERNAME\\AppData\\Local\\gnupg\\bin\\gpg")

将路径替换为您找到的路径


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接