我正在尝试验证一个文件的签名,但当我使用gnupg对象创建它时,出现了以下错误:
gpg = gnugp.GPG(gnupghome='/Users/myname/.gnupg')
然而,我一直收到“没有这样的文件或目录”错误。我还尝试了不同的主目录路径,以及不包括路径并让它使用默认值,但都没有成功。
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)
>>> 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)
>>> 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))
我遇到了同样的问题,并找到了解决方案。这个问题是特定于OSX的,因为gpg二进制文件本身没有被找到而导致的。
因此,将完整路径作为参数传递解决了这个问题。
gpg = gnugp.GPG(gnupghome='/Users/myname/.gnupg', gpgbinary='/usr/local/bin/gpg')
我知道这个问题已经很老了,但也许有人会发现这个有用。我曾经遇到过完全相同的问题,并找到了另一个解决方案,结果证明是相当愚蠢的。
在Gnu Privacy Guard website上有三个可供下载的版本。如果你碰巧使用以数字2开头的版本,实际程序被称为gpg2
,而python-gnupg
则无法找到它正在寻找的内容,因此会出现错误。
只需安装“经典版本”(此时为1.4.20),例如如果你在macos上:brew install gnupg
,一切都应该没问题。
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