【问题标题】:python gnupg.GPG no such file or directorypython gnupg.GPG 没有这样的文件或目录
【发布时间】:2014-04-09 01:38:19
【问题描述】:

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

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

但是,我不断收到没有此类文件或目录的错误。我也为家庭尝试了不同的路径,以及不包括路径并让它使用默认路径,都无济于事。

【问题讨论】:

  • 目录是否存在?
  • 是的,尽管根据文档(特别是 here),这无关紧要。
  • 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

标签: python gnupg


【解决方案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))

【讨论】:

    【解决方案2】:

    我知道这个问题已经很老了,但也许有人会觉得这很有帮助。我遇到了完全相同的问题,并找到了另一种非常愚蠢的解决方案。

    Gnu Privacy Guard website 上有三个版本可供下载。如果您有任何机会使用以数字 2 开头的版本,则实际程序称为 gpg2python-gnupg 将看不到它要查找的内容,因此会出现错误。 只需安装“经典版”(此时为 1.4.20),例如如果您使用的是 macos:brew install gnupg,一切都应该没问题。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题并找到了解决问题的方法。这个问题是 OSX 特有的,是因为找不到 gpg 二进制文件本身而引起的。

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

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

      【讨论】:

      • 我希望这会对我有所帮助,因为我使用的是 OSX,但您建议的代码 sn-p 有语法错误...“SyntaxError: invalid syntax”...因为您在 ...me/.gnupg' 和 gpgbinary='/usr/loc 之间有一个空格 ...它应该是一个逗号吗?我用逗号试了一下,还是不行。
      • 您对逗号的看法是完全正确的。感谢您指出。此外,根据文档pythonhosted.org/python-gnupg/#getting-started 参数应该在那里(仍然)。你遇到了什么错误?
      猜你喜欢
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 2021-06-24
      • 2015-11-19
      相关资源
      最近更新 更多