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

时间:2014-04-09 01:38:20

标签: python gnupg

我正在尝试验证文件签名,但是在使用

创建gnupg对象时
gpg = gnugp.GPG(gnupghome='/Users/myname/.gnupg')

但是我一直没有得到这样的文件或目录错误。我也为家庭尝试了不同的路径,并且不包括路径并让它使用默认路径,但都无济于事。

3 个答案:

答案 0 :(得分: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)

注意字符编码的变化,这是为了防止在读取一些可能包含奇怪密钥的密钥环时出现错误(如果将其保留为#34; UTF-8"则可能会或可能不会破坏脚本)。这将导致pkeys和skeys被创建为列表,每个条目包含密钥环中每个键的dict。

详细表格导致:

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

答案 1 :(得分:0)

我遇到了同样的问题并找到了问题的解决方案。问题是OSX特定的,并且是由于找不到gpg二进制文件而导致的。

因此,将完整路径作为参数传递给二进制文件解决了问题。

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

答案 2 :(得分:0)

我知道这个问题已经过时了,但也许有人会觉得这很有帮助。我有完全相同的问题,并发现另一个解决方案,结果是非常愚蠢。

Gnu Privacy Guard website上有三个版本可供下载。如果您使用的是以数字2开头的版本,那么实际程序将被称为gpg2并且python-gnupg无法查看它正在寻找的内容,因此错误。 只需安装"经典版本" (此时为1.4.20),例如如果你在macos:brew install gnupg,一切都应该没问题。