使用Python gnupg包,我收到错误“Homedir''C:/ Users / ...'需要读/写权限”

时间:2017-11-09 16:30:00

标签: python gnupg pgp

我在Anaconda中使用Python 3.6.1版运行Windows 7。我使用pip install gnupg安装了python包gnupg。

我从ftp://ftp.gnupg.org/gcrypt/binary/下载了gnupg Windows可执行文件2.1.23。

当我使用下面两行中的任何一行运行代码时,它会因以下错误而失败。

import gnupg

gpg = gnupg.GPG(binary='C:/Program Files (x86)/GnuPG/bin/gpg.exe',
               homedir='C:/Users/Alex/Desktop/SFTP Connection')

# gpg = gnupg.GPG(binary='C:/Program Files (x86)/GnuPG/bin/gpg.exe')

然而,当我用两行中的任何一行运行Python代码时,它就失败了。

import gnupg
# gpg = gnupg.GPG(homedir='C:/Program Files (x86)/GnuPG')
gpg = gnupg.GPG(homedir='C:/Program Files (x86)/GnuPG/bin')

---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\gnupg\_meta.py in _homedir_setter(self, directory)
    434                 assert _util._has_readwrite(hd), \
--> 435                     "Homedir '%s' needs read/write permissions" % hd
    436             except AssertionError as ae:

AssertionError: Homedir ''C:/Users/Alex/Desktop/SFTP Connection'' needs read/write permissions

During handling of the above exception, another exception occurred:

RuntimeError                              Traceback (most recent call last)
<ipython-input-4-ae272cb064fb> in <module>()
      1 gpg = gnupg.GPG(binary='C:/Program Files (x86)/GnuPG/bin/gpg.exe',
----> 2                homedir='C:/Users/Alex/Desktop/SFTP Connection')

C:\ProgramData\Anaconda3\lib\site-packages\gnupg\gnupg.py in __init__(self, binary, homedir, verbose, use_agent, keyring, secring, ignore_homedir_permissions, options)
    123             verbose=verbose,
    124             use_agent=use_agent,
--> 125             ignore_homedir_permissions=ignore_homedir_permissions,
    126         )
    127 

C:\ProgramData\Anaconda3\lib\site-packages\gnupg\_meta.py in __init__(self, binary, home, keyring, secring, use_agent, default_preference_list, ignore_homedir_permissions, verbose, options)
    181         self.ignore_homedir_permissions = ignore_homedir_permissions
    182         self.binary  = _util._find_binary(binary)
--> 183         self.homedir = os.path.expanduser(home) if home else _util._conf
    184         pub = _parsers._fix_unsafe(keyring) if keyring else 'pubring.gpg'
    185         sec = _parsers._fix_unsafe(secring) if secring else 'secring.gpg'

C:\ProgramData\Anaconda3\lib\site-packages\gnupg\_util.py in __set__(self, obj, value)
    763             self.fset(obj, value)
    764         else:
--> 765             getattr(obj, self.fset.__name__)(value)
    766 
    767     def __delete__(self, obj):

C:\ProgramData\Anaconda3\lib\site-packages\gnupg\_meta.py in _homedir_setter(self, directory)
    438                 log.debug("GPGBase.homedir.setter(): %s" % msg)
    439                 log.debug(str(ae))
--> 440                 raise RuntimeError(str(ae))
    441             else:
    442                 log.info("Setting homedir to '%s'" % hd)

RuntimeError: Homedir ''C:/Users/Alex/Desktop/SFTP Connection'' needs read/write permissions

我运行了以下两个命令,并验证了该文件夹具有读写权限。

>>> os.access('C:/Users/Alex/Desktop/SFTP Connection', os.W_OK)
True
>>> os.access('C:/Users/Alex/Desktop/SFTP Connection', os.R_OK)
True
>>>

2 个答案:

答案 0 :(得分:2)

GnuPG主目录是GnuPG存储密钥环和信息的地方。您无法使用此配置变量来确定Python模块搜索二进制文件的位置。事实上, never 应该设置为存储二进制文件的地方(也不应该在程序文件目录中)。

相反,将目录添加到%PATH环境变量或使用binary变量,该变量应包含二进制文件的绝对路径:

gpg = gnupg.GPG(binary='C:/Program Files (x86)/GnuPG/bin/gpg.exe')

来自Python module's documentation

  

binarystr) - GnuPG二进制可执行文件的名称。如果未给出绝对路径,则搜索环境变量$PATH以查找可执行文件,并检查用户的真实uid / gid是否具有足够的权限。

     

homedirstr) - 包含公钥和私钥的目录的完整路径名。默认值是GnuPG默认的值。

答案 1 :(得分:2)

关于新权限错误,我想这实际上是gnupg的错误,我have submitted a patch