Python gnupg.GPG没有此文件或目录。

3

我正在尝试验证一个文件的签名,但当我使用gnupg对象创建它时,出现了以下错误:

gpg = gnugp.GPG(gnupghome='/Users/myname/.gnupg')

然而,我一直收到“没有这样的文件或目录”错误。我还尝试了不同的主目录路径,以及不包括路径并让它使用默认值,但都没有成功。


该目录是否存在? - AMADANON Inc.
是的,尽管根据文档(特别是这里)来看,那应该没关系。 - walshie4
gpg = gnugp.GPG(gnupghome="/Users/myname/.gnupg", verbose=True)的输出是什么?理想情况下,您希望它最终变成这样:gpg --status-fd 2 --no-tty --homedir /Users/myname/.gnupg --no-default-keyring --keyring /Users/myname/.gnupg/pubring.gpg --secret-keyring /Users/myname/.gnupg/secring.gpg --version - Ben
3个回答

1
一些功能只需要指定GPG家目录(即~/.gnupg),而其他功能则需要更多的内容,特别是在操作密钥环时。我通过在与其他脚本相同的目录中创建一个config.py文件来解决这个问题,其中包含以下内容:
homedir = "/Users/username"
gpg_home = homedir+"/.gnupg"
gpg_homeshort = "~/.gnupg" # optional
pub_ring = gpg_home+"/pubring.gpg"
sec_ring = gpg_home+"/secring.gpg"
pring = []
sring = []
pring.append(pub_ring)
sring.append(sec_ring)

这是针对OS X的,如果是Linux、BSD和其他UNIX系统,请将第一行改为:

homedir = "/home/username"

对于基本加密和解密脚本,这应该可以工作:
import gnupg
from config import *
gpg = gnupg.GPG(gnupghome=gpg_home)

使用verbose参数,结果如下:

>>> gpg = gnupg.GPG(gnupghome=gpg_home, verbose=True)
gpg --status-fd 2 --no-tty --homedir /Users/username/.gnupg --version
>>> 

较短的形式结果如下:
>>> gpg = gnupg.GPG(gnupghome=gpg_homeshort, verbose=True)
gpg --status-fd 2 --no-tty --homedir '~/.gnupg' --version
>>> 

对于搜索默认钥匙环的脚本,应该可以这样操作:
import gnupg
from config import *
gpg = gnupg.GPG(gnupghome=gpg_home, keyring=pring, secret_keyring=sring)
gpg.encoding = "latin-1"
pkeys = gpg.list_keys(False)
skeys = gpg.list_keys(True)

请注意字符编码的更改,这是为了防止读取某些可能包含奇怪密钥的关键环时出现错误(如果保留“UTF-8”,可能会破坏脚本)。这将导致pkeys和skeys被创建为列表,每个条目都包含关键环中每个密钥的字典。
详细表述如下:
>>> gpg = gnupg.GPG(gnupghome=gpg_home, keyring=pring, secret_keyring=sring, verbose=True)
gpg --status-fd 2 --no-tty --homedir /Users/username/.gnupg --no-default-keyring --keyring /Users/username/.gnupg/pubring.gpg --secret-keyring /Users/username/.gnupg/secring.gpg --version
>>>

简写形式为:

短格式结果:

>>> gpg = gnupg.GPG(gnupghome=gpg_homeshort, keyring=pring, verbose=True)
gpg --status-fd 2 --no-tty --homedir '~/.gnupg' --no-default-keyring --keyring /Users/username/.gnupg/pubring.gpg --version
>>> 

很可能通过操纵路径来使用替代钥匙环或者相对路径实现便携式应用。无论如何,这里有一个关于密钥环的简洁演示(假设与上述相同的配置文件):
import gnupg
from config import *

gpg = gnupg.GPG(gnupghome=gpg_home, keyring=pring, secret_keyring=sring)
gpg.encoding = "latin-1"
pkeys = gpg.list_keys(False)
skeys = gpg.list_keys(True)

pnum = len(pkeys)
snum = len(skeys)

print("""
%s contains %d public keys
%s contains %d private keys
""" % (pub_ring, pnum, sec_ring, snum))

0

我遇到了同样的问题,并找到了解决方案。这个问题是特定于OSX的,因为gpg二进制文件本身没有被找到而导致的。

因此,将完整路径作为参数传递解决了这个问题。

gpg = gnugp.GPG(gnupghome='/Users/myname/.gnupg', gpgbinary='/usr/local/bin/gpg')

我曾经满怀希望这会对我有所帮助,因为我正在使用OSX,但是你建议的代码片段有语法错误... "SyntaxError: invalid syntax"... 因为你在...me/.gnupg'和gpgbinary='/usr/loc之间有一个空格... 那里应该有一个逗号吗?我尝试了加上逗号,但它并不起作用。 - j413254
1
你关于逗号的观点是完全正确的。感谢你指出来。此外,根据文档 https://pythonhosted.org/python-gnupg/#getting-started 参数应该还在。你遇到了什么错误? - Elwin

0

我知道这个问题已经很老了,但也许有人会发现这个有用。我曾经遇到过完全相同的问题,并找到了另一个解决方案,结果证明是相当愚蠢的。

Gnu Privacy Guard website上有三个可供下载的版本。如果你碰巧使用以数字2开头的版本,实际程序被称为gpg2,而python-gnupg则无法找到它正在寻找的内容,因此会出现错误。 只需安装“经典版本”(此时为1.4.20),例如如果你在macos上:brew install gnupg,一切都应该没问题。


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