Python gnupg.GPG 没有这样的文件或目录

3 投票
3 回答
7750 浏览
提问于 2025-04-18 01:57

我正在尝试验证一个文件的签名,不过在创建我的gnupg对象时,使用了

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

但是我总是遇到“没有这样的文件或目录”的错误。我还尝试了不同的路径来设置主目录,甚至不指定路径让它使用默认的,但都没有解决问题。

3 个回答

0

我知道这个问题已经有点久了,但也许有人会觉得这个信息有用。我遇到过完全一样的问题,后来找到了一种解决办法,结果还挺简单的。

Gnu Privacy Guard的网站上,有三个版本可以下载。如果你恰好使用的是以数字2开头的版本,那么实际的程序叫做gpg2,而python-gnupg找不到它想要的东西,所以就会出现错误。只需要安装“经典版本”(目前是1.4.20),比如如果你在macos上,可以用brew install gnupg来安装,这样一切就应该没问题了。

0

我遇到了同样的问题,并找到了解决办法。这个问题是特定于OSX系统的,主要是因为找不到gpg这个程序。

所以,把这个程序的完整路径作为参数传递过去,就解决了这个问题。

gpg = gnugp.GPG(gnupghome='/Users/myname/.gnupg', gpgbinary='/usr/local/bin/gpg')
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)

使用详细参数后,结果是:

>>> 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))

撰写回答